我想知道有没有办法可以使用(&:method)链接方法
例如:
array.reject { |x| x.strip.empty? }
将其变为:
array.reject(&:strip.empty?)
由于其可读性,我更喜欢简写符号。
答案 0 :(得分: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?
只是给你一个例外,因此它们并不完全等同;但是,您可能也想拒绝nil
,因此无论如何使用blank?
可能会更好。对于blank?
,false
和{}
,[]
也会返回true,但您可能没有字符串数组中的那些。
答案 1 :(得分:2)
编写上面的内容会非常好,但它不是一种受支持的语法,你想要使用to_proc语法(& :)链接方法的方式是这样的:
.map(&:strip).reject(&:empty?)
答案 2 :(得分:1)
您可以使用ampex
gem:
require 'ampex'
array.reject &X.strip.empty?