这是众所周知的
Rubyist&会在符号上调用to_proc,所以
[:a,:b,:c].map(&:to_s)
相当于
[:a,:c].map { |e| e.to_s } # => ["a","b","c"]
[:a,:c].map { |e| e.to_s.upcase } [:a,:c].map(&:to_s).map(&:upcase)
我的问题是,是否有办法将& amp;符号#to_proc调用一个参数?就像是:
[:a,:c].map(&:to_s:upcase)
谢谢!
解决方法
如果你只是这样做:
%i[a b c].map { |e| e.to_s.upcase }
然后只需使用块并继续处理更重要的事情.如果您真的在进行一系列Enumerable调用,并且发现块太吵了:
%i[a b c].map { |e| e.to_s.upcase }.some_chain_of_enumerable_calls...
然后你可以把你的逻辑扔进一个lambda来帮助清理外观:
to_s_upcase = lambda { |e| e.to_s.upcase } %i[a b c].map(&to_s_upcase).some_chain_of_enumerable_calls...
或者把它扔进一个方法并说:
%i[a b c].map(&method(:to_s_upcase)).some_chain_of_enumerable_calls...
无论哪种方式,你都会给你的一些逻辑命名(这几乎都是&:符号为你做的),使代码更易读,更容易理解.在to_s.upcase的特定情况下,这一点都没有意义,但是当块变大时,这些方法非常有用.