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

标签 ruby iterator

我有一个带有自定义 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/

相关文章:

java - 从链表中删除包含特定字符串的元素

c++ - 使用列表迭代器排序

ruby - Watir:在复选框中选择一个项目

mysql - 仅当用户登录匹配电子邮件时,Ruby On Rails API 更新记录

c++ - 如何使用自动变量选择迭代器类型?

string - 从字符串创建字符切片的滑动窗口迭代器

ruby-on-rails - Ruby resque 后台 CSV 导入不运行

ruby-on-rails - 删除记录之前不会出现确认弹出窗口

javascript - 如何使用 rails javascript 助手将 "data-main"属性添加到脚本标签?

C++:在迭代器之间的计算距离上被类型混淆