2016-12-06 1 views
1

選択フィルタの引数としてvalid_transactionが返すProcを使用することができません。私はクラスなしでメソッドを書くときにこれを行うことができます。Rubyで選択/拒否フィルタでメソッドから返されたProc/lambdaを使用できません

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

この問題は、問題を表示する必要がないため、self.confirmedを削除すると改善される可能性があります。 「Elecrum :: History.unconfirmed」と呼ぶと、この構文エラーが発生します:... " –

答えて

5

あなたはコロンを削除する必要があります。

list.select(&valid_transaction) 

&構文はブロックを期待している方法にラムダまたはPROCを渡すために使用されます。それがここに必要なのです。コロンで

は、効果は多少異なります。

list.select(&:valid_transaction) 

がこれに相当します

ない
list.select { |tx| tx.valid_transaction } 

あなたがすべてでいきたいと考えています。

コロンがこの影響を与えるのは、Rubyが&引数の#to_procを呼び出すためです。シンボル(:valid_transaction)は#to_procに応答し、シンボルで指定されたメソッドを呼び出すprocを作成します。

+0

ありがとう!私はそれが間違って理解していた!だから、私は変数を提供することもできます。私はこれを知らなかったとは信じられません:) –

+0

"コロンでRubyは何か違うことをしようとしています。 - それは誤解を招く。彼らは、実際には、同じことです。人々は '&:何でも'をいくらかの黒い魔法と見なしますが、そうではありません。 'foo(&bar) 'と言っているのは、' bar'をブロックとして与えられたかのように評価して返された 'Proc'を渡す' foo'メソッドを意味し、 'Proc'でない場合は' to_proc 「最初」。例えば ​​'Hash'、' Symbol'と 'Method'は' to_proc'を実装しています。 '' Array'と 'Set'もそうするべきだと私は主張しました。(https://bugs.ruby-lang.org/issues/11262#change-59342)。 –

+0

@JörgWMittag確かに同じことです。私は故意に詳細を暴露していましたが、私はそれをよりよく言えるかもしれないと思います。 –

関連する問題