我有一个自定义每个方法的类:
class CurseArray < Array
def each_safe
each do |element|
unless element =~ /bad/
yield element
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
并且想要调用不同的块方法,例如对这些迭代元素进行"收集"或"注入".例如:
curse_array.each_safe.magic.collect {|element| "#{element} is a nice sentence."}
Run Code Online (Sandbox Code Playgroud)
我知道有一个特定的功能(我在这里称之为"魔术")来做到这一点,但我已经忘记了.请帮忙!:-)
如果一个方法产生,你将需要传递一个块.无法定义自动传递的块.
最接近我可以达到你的规格是这样的:
def magic(meth)
to_enum(meth)
end
def test
yield 1
yield 2
end
magic(:test).to_a
# returns: [1,2]
Run Code Online (Sandbox Code Playgroud)
实现您的请求最简洁的方法可能是:
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"]
Run Code Online (Sandbox Code Playgroud)