在迭代器上调用块方法:each.magic.collect {...}

bli*_*nry 4 ruby iterator

我有一个自定义每个方法的类:

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)

我知道有一个特定的功能(我在这里称之为"魔术")来做到这一点,但我已经忘记了.请帮忙!:-)

Sam*_*ron 6

如果一个方法产生,你将需要传递一个块.无法定义自动传递的块.

最接近我可以达到你的规格是这样的:

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)