假设我想得到一个数组中的第一个数字,它只出现在其中一次。
所以,通常我会按照以下方式进行:
arr = [1,1,2,2,3,4,4]
arr.detect { |elem| arr.count(elem) == 1 } # => 3
我一直想知道是否有可能获得数组而不需要事先将其分配给变量,不知何故这样:
[1,1,2,2,3,4,4].detect { |elem| self.count(elem) == 1 } # => NoMethodError
这当然不起作用,因为上面的self
指的是Object
。
那么,是否有可能以某种方式引用一个对象,在其块中调用了可枚举方法,就像上面的例子一样?
答案 0 :(得分:2)
module Enumerable
def with_self
return to_enum(:with_self) unless block_given?
each do |element|
yield element, self.entries
end
end
end
[1,1,2,2,3,4,4].detect.with_self { |elem, zelf| zelf.count(elem) == 1 }
答案 1 :(得分:0)
我会使用BasicObject#instance_eval
:
在接收器(obj)的上下文中计算包含Ruby源代码或 给定块的字符串。为了设置上下文,在代码执行时将变量self设置为obj,使代码可以访问obj的实例变量。 在带有String的instance_eval版本中,可选的第二个和第三个参数提供报告编译错误时使用的文件名和起始行号。
ary = [1,1,2,2,3,4,4]
ary.instance_eval do
detect { |elem| count(elem) == 1 } # => 3
end