请参阅可枚举方法块内的调用者对象

时间:2014-01-15 22:06:28

标签: ruby enumerable

假设我想得到一个数组中的第一个数字,它只出现在其中一次。

所以,通常我会按照以下方式进行:

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

那么,是否有可能以某种方式引用一个对象,在其块中调用了可枚举方法,就像上面的例子一样?

2 个答案:

答案 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