假设:
a = [{aa: '123'}, {aa: '321'}]
可以用
a.map{ |b| b[:aa] }
=> ["123", "321"]
不过如果想使用&:的话,该怎么写?想达到的想过如下:
#错误示范
a.map(&:[:aa])
如果 LZ 只是想少写一些括号的话
require 'active_support/core_ext/enumerable'
[{aa: '123'}, {aa: '321'}].pluck :aa
# => ["123", "321"]
反正Array#to_proc也没人用,自己定义一个就好了
class Array
def to_proc
->(x){ x[first] }
end
end
p [{aa: 1}, {aa: 2}].map(&[:aa]) #=> [1, 2]
&后面跟的是 Symbol,我们可以给它加个 monkey patch
class Symbol
def call(*args, &block)
->(caller, *rest) { caller.send(self, *rest, *args, &block) }
end
end
然后 call 在 Ruby 里面有.() 的便捷调用,就可以这样写了:
a = [{aa: '123'}, {aa: '321'}]
a.map &:[].(:aa)
忘记在哪里看到这个技巧的,但是真的很好用
[%w(hello world), %w(ruby on rails), %w(foo bar)].map(&:inject.(&:+))