【发布时间】:2012-02-27 04:50:54
【问题描述】:
我想知道有没有一种方法可以使用 (&:method) 链接方法
例如:
array.reject { |x| x.strip.empty? }
把它变成:
array.reject(&:strip.empty?)
由于它的可读性,我更喜欢简写符号。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3.1
我想知道有没有一种方法可以使用 (&:method) 链接方法
例如:
array.reject { |x| x.strip.empty? }
把它变成:
array.reject(&:strip.empty?)
由于它的可读性,我更喜欢简写符号。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3.1
不,没有简写。你可以定义一个方法:
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,但您的字符串数组中可能没有这些。
【讨论】:
这样写上面的内容会很好,但它不是受支持的语法,您希望使用 to_proc 语法 (&:) 链接方法的方式如下:
.map(&:strip).reject(&:empty?)
【讨论】:
map 的一部分分配。
您可以使用ampex gem:
require 'ampex'
array.reject &X.strip.empty?
【讨论】: