带有块的方法的包装器

时间:2011-11-11 11:18:11

标签: ruby

我想将组合方法与自定义类一起使用。

如果我的班级看起来像这样......

class MyClass
  def initialize
    @data = []
  end
  def to_a
    @data
  end
end

我可以称之为......

myobj = MyClass.new
myobj.to_a.combination(2) {|a,b| puts "#{a} #{b}" }

但我宁愿有这个......

myobj.combination {|a,b| puts "#{a} #{b}" }

我尝试编写一个类方法来包装组合方法,传递块。但它不起作用。

def combination(&block)
  @data.to_a.combination(2) block.call
end

另外,有没有人知道为什么组合在Array类中而不是Enumerable?我原以为它会更有用。

2 个答案:

答案 0 :(得分:4)

该块是Array#组合的一种特殊参数(就像您在自己的定义中得到的那样)。正确的调用是:

def combination(&block)
  @data.to_a.combination(2, &block)
end

答案 1 :(得分:0)

试试这个:

def combination(&block)
  @data.to_a.combination(2) { block }
end