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

Unable to use Proc/lambda returned from method in select/reject filters in Ruby

我无法使用 valid_transaction 返回的 Proc 作为 select 过滤器中的参数,有什么想法吗?在没有 类.

的情况下编写方法时,我能够做到这一点
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

您需要删除冒号:

list.select(&valid_transaction)

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

加上冒号,效果有些不同:

list.select(&:valid_transaction)

相当于:

list.select { |tx| tx.valid_transaction }

这根本不是你想要的。

冒号产生这种影响的原因是 Ruby 在 & 参数上调用了 #to_proc。一个符号(:valid_transaction 是什么)通过创建一个调用由符号命名的方法的过程来响应#to_proc。