2016-12-06 3 views
1

Я не могу использовать Proc, возвращенный valid_transaction как аргумент в фильтре выбора, любые идеи почему? Я могу это сделать при написании методов без классов.Невозможно использовать Proc/lambda, возвращенный методом в фильтрах выбора/отклонения в Ruby

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) 

Синтаксис & используется для передачи лямбды или процедурного к способу, который ожидает блок. Вот что вам нужно здесь.

С толстой кишки, эффект несколько отличается:

list.select(&:valid_transaction) 

эквивалентно следующему:

list.select { |tx| tx.valid_transaction } 

Который не то, что вы собираетесь вообще.

Причина, по которой двоеточие имеет такое влияние, заключается в том, что Ruby вызывает #to_proc в аргументе &. Символ (который является то, что :valid_transaction) отвечает на #to_proc, создавая proc, который вызывает метод, названный символом.

+0

Спасибо! Я понял это неправильно! Итак, теперь я могу даже поставлять переменные, я не могу поверить, что не знал этого :) –

+0

«С двоеточием Ruby пытается сделать что-то другое». - Это вводит в заблуждение. На самом деле это одно и то же. Люди рассматривают '&: whatever' как некоторую черную магию, но это не так. Выражение 'foo (& bar)' означает «метод вызова' foo', передающий 'Proc', возвращаемый путем вычисления' bar', как если бы он был поставлен как блок, и если объект уже не является 'Proc', вызовите' to_proc «первый». Например, «Хэш», «Символ» и «Метод» реализуют «to_proc» и [Я утверждал, что 'Array' и' Set' должны делать это также] (https://bugs.ruby-lang.org/вопросы/11262 # переключающих 59342). –

+0

@ JörgWMittag Это действительно то же самое. Я намеренно возвращался к деталям, но, наверное, я мог бы сформулировать это лучше. –

 Смежные вопросы

  • Нет связанных вопросов^_^