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

我想知道有没有办法可以使用(&:方法)链接方法

例如:

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

把它变成:

 array.reject(&:strip.empty?) 

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

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

 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?否则我不会更好地调用其中任何一个really_empty? 在足够的地方分裂逻辑是有道理的。

但是,既然你正在使用Rails,你可以使用blank? 而不是.strip.empty?

 array.reject(&:blank?) 

请注意, nil.blank? 是真的,而nil.strip.empty? 只是给你一个例外,所以它们并不完全相同; 但是,你可能想要拒绝nil s,所以使用blank? 无论如何可能会更好。 blank? 对于false{}[]也返回true,但是你的字符串数组可能没有。

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

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

你可以用ampex gem做到这ampex

 require 'ampex' array.reject &X.strip.empty?