在Ruby中使用Symbol#to_proc速记链接方法?

问题描述 投票:9回答:3

我想知道是否有一种方法可以使用(&:方法)链接方法

例如:

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

把它变成:

array.reject(&:strip.empty?)

由于其可读性,我更喜欢简写符号。

ruby-on-rails ruby ruby-on-rails-3.1
3个回答
7
投票

不,没有简写。您可以定义一个方法:

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

并使用method

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

或者使用lambda:

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

但是除非你在足够的地方使用really_empty?,否则我不会把它们中的任何一个称为更好的分裂逻辑是有道理的。

但是,由于你使用的是Rails,你可以使用blank?而不是.strip.empty?

array.reject(&:blank?)

请注意,nil.blank?是正确的,而nil.strip.empty?只是给你一个例外,因此它们并不完全相同;但是,你可能也想拒绝nils,所以使用blank?可能会更好。 blank?也为false{}[]返回true,但你可能没有那些字符串数组。


2
投票

编写上面的内容会非常好,但它不是支持的语法,你想要使用to_proc语法(&:)链接方法的方式是这样的:

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


1
投票

你可以用ampex gem做到这一点:

require 'ampex'
array.reject &X.strip.empty?
© www.soinside.com 2019 - 2024. All rights reserved.