Цепочка методов с использованием сокращенного обозначения Symbol # to_proc в Ruby? - PullRequest
9 голосов
/ 27 февраля 2012

Мне интересно, есть ли способ связать метод с помощью (&: method)

Например:

array.reject { |x| x.strip.empty? }

Чтобы превратить это в:

array.reject(&:strip.empty?)

Я предпочитаю сокращенную запись из-за ее читабельности.

Ответы [ 3 ]

7 голосов
/ 27 февраля 2012

Нет, для этого нет сокращений. Вы можете определить метод:

def really_empty?(x)
  x.strip.empty?
end

и используйте method:

array.reject(&method(:really_empty?))

или используйте лямбду:

really_empty = ->(x) { x.strip.empty? }
array.reject(&really_empty)

но я бы не назвал ни одного из них лучше, если бы у вас не было использования really_empty? в достаточном количестве мест, где логика имеет смысл.

Однако, поскольку вы используете Rails, вы можете просто использовать blank? вместо .strip.empty?:

array.reject(&:blank?)

Обратите внимание, что nil.blank? истинно, тогда как nil.strip.empty? просто вручает вам исключение, поэтому они не совсем эквивалентны; однако, вы, вероятно, также хотите отклонить nil с, так что использование blank? может быть лучше в любом случае. blank? также возвращает true для false, {} и [], но, вероятно, их нет в вашем массиве строк.

2 голосов
/ 27 февраля 2012

Было бы неплохо написать вышеупомянутое, как это, но это не поддерживаемый синтаксис, способ, которым вы хотели бы объединить методы, использующие синтаксис to_proc (& :), выглядит так:

.map(&:strip).reject(&:empty?)

1 голос
/ 26 августа 2016

Вы можете сделать это с помощью ampex драгоценного камня:

require 'ampex'
array.reject &X.strip.empty?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...