无法使用Ruby中的select / reject过滤器中从方法返回的Proc / lambda

时间:2016-12-06 09:36:30

标签: ruby lambda bitcoin

我无法使用valid_transaction返回的Proc作为选择过滤器中的参数,任何想法为什么?在没有类的情况下编写方法时,我能够做到这一点。

require 'json'

module Electrum
  class History
    def self.valid_transaction
      lambda { |tx| tx["date"] == "----" }
    end

    def self.list
      JSON::parse `electrum history`
    end

    def self.confirmed
      list.reject { |tx| tx["date"] == "----" }
    end

    def self.unconfirmed
      list.select(&:valid_transaction)
    end
  end
end

1 个答案:

答案 0 :(得分:5)

您需要删除冒号:

list.select(&valid_transaction)

&语法用于将lambda或proc传递给期望块的方法。这就是你需要的。

使用冒号,效果有所不同:

list.select(&:valid_transaction)

相当于:

list.select { |tx| tx.valid_transaction }

这根本不是你想要的。

冒号有这种影响的原因是Ruby在&参数上调用#to_proc。符号(即:valid_transaction是)通过创建调用符号命名的方法的proc来响应#to_proc。