无法使用从 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。
我无法使用 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。