2016-12-06 34 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)通過創建一個調用由該符號命名的方法的proc來響應#to_proc。

+0

謝謝!我瞭解它錯了!所以,現在我甚至可以提供變量,我不敢相信我不知道這個:) –

+0

「有了冒號,Ruby會嘗試做一些不同的事情。」 - 這是誤導。事實上,他們是一樣的。人們把'&:無論'當成一些黑魔法,但事實並非如此。說'foo(&bar)'意思是「調用方法'foo'通過評估'bar'返回傳遞'Proc',就好像它是作爲一個塊提供的;如果這個對象不是'Proc',則調用'to_proc 「第一」。例如''Hash','Symbol'和'Method'實現'to_proc',[我爭辯說''Array'和'Set'也應該這樣做](https://bugs.ruby-lang.org /問題/ 11262#轉換59342)。 –

+0

@JörgWMittag確實是一回事。我故意忽略了細節,但我想我可以更好地表達它。 –

相關問題