2011-03-09 120 views
4

我跑到那裏我留下了一個空間,這樣紅寶石:方法的語法

@entries = [#<Entry id: 3806, approved: false, submitted: false] 

@entries.any?&:submitted? => true 
@entries.any? &:submitted? => false 

怎樣的空間改變行爲的錯誤。 Entry.submitted?對於數組中的所有元素,=> false,第二行有所需的行爲。

+0

適用於我,1.8和1.9,用一個簡單的'類入口; def提交?真正的結束'。我們能否看到可能的最小代碼來重現問題? – pilcrow 2011-03-09 17:23:10

+0

1.8.7 REE在spave和無空間方面效果很好'[1,2,nil] .any?&:nil?'和'[1,2,nil] .any? &:nil?' – fl00r 2011-03-09 17:32:39

回答

18

問題是,&也是一個優先級的一元運算符。

當你這樣做:

@entries.any?&:submitted? 

你實際做的是:

(@entries.any?)&(:submitted?) 

導致如此。由於@entries中有條目,符號:提交?有真實的價值。

當你這樣做:

@entries.any? &:submitted? 

什麼你實際上做的是這樣的:

@entries.any?(&:submitted?) 

這是你真正想要的。

@pilcrow得到了他的工作的原因是,他/她用的是下面的類:

class Entry 
    def submitted? 
    true 
    end 
end 

要重現的結果,可以使用下面的類:

class Entry 
    def submitted? 
    false 
    end 
end 

PS:同以@ fl00r爲例:

[1,2,nil].any?&:nil? and [1,2,nil].any? &:nil? 

[1,2,nil] .any?結果是正確的:無?具有真值的真值,所以結果是相同的,因爲[1,2,nil]也包含零值,但是計算是不同的。

+0

偉大的答案! +1 – 2011-03-09 17:34:54

+0

啊哈!很好的答案。如果現在看起來如此明顯,我是不是在撓我的腦袋呢? – 2011-03-09 17:35:46

+0

啊,這樣做更有意義!謝謝! – loosecannon 2011-03-09 17:55:01