我有一个带有自定义 each-method 的类:
class CurseArray < Array
def each_safe
each do |element|
unless element =~ /bad/
yield element
end
end
end
end
并且想要调用不同的 block 方法,如对那些迭代元素的“收集”或“注入(inject)”。例如:
curse_array.each_safe.magic.collect {|element| "#{element} is a nice sentence."}
我知道有一个特定的函数(我在这里称之为“魔法”)可以做到这一点,但我忘记了。请帮忙! :-)
最佳答案
如果一个方法产生了,你需要给它传递一个 block 。无法定义自动通过自身的 block 。
我能得到的最接近您的规范的是:
def magic(meth)
to_enum(meth)
end
def test
yield 1
yield 2
end
magic(:test).to_a
# returns: [1,2]
实现您的请求的最干净的方法可能是:
class MyArray < Array
def each_safe
return to_enum :each_safe unless block_given?
each{|item| yield item unless item =~ /bad/}
end
end
a = MyArray.new
a << "good"; a << "bad"
a.each_safe.to_a
# returns ["good"]
关于ruby - 在迭代器上调用 block 方法 : each. magic.collect { ... },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2591393/