未声明的可枚举对象是否有可能在块中调用自身?

bou*_*uby 2 ruby block self

我最近问了一个问题(三个或更多对象的等式测试),我试图确定一种优雅的方式来对一组3个或更多对象进行相等测试.其中一个解决方案是这样的:

array = [1,1,1,1]
array.all? {|x| x == array.first }
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以将它减少到只有一行,这样我就可以做一些像这样解释的东西:

[1,1,1,1].all? {|x| x == [1,1,1,1].first }
#=> true
Run Code Online (Sandbox Code Playgroud)

在某种程度上,我能够引用块所调用的初始对象,而无需先在前一行中声明该对象.在伪代码中,我想要做的是这样的事情:

[1,1,1,1].all? {|x| x == object_being_called_on_by_block.first }
#=> true
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个,但没有用:

[1,1,1,1].all? { |x| x == self.first }
Run Code Online (Sandbox Code Playgroud)

saw*_*awa 5

这在SO上经常被问到,并经常被要求作为Ruby核心的一个特性.到目前为止,Ruby核心开发人员建议:

[1,1,1,1].tap{|a| break a.all?{|x| x == a.first}}
Run Code Online (Sandbox Code Playgroud)

如果您不介意性能,可以执行以下操作:

[1,1,1,1].instance_eval{all?{|x| x == first}}
Run Code Online (Sandbox Code Playgroud)