2011-03-09 64 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