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

时间:2012-02-27 04:50:55

标签: ruby-on-rails ruby ruby-on-rails-3.1

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

例如:

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

将其变为:

array.reject(&:strip.empty?)

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

3 个答案:

答案 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?