Pet*_*own 4 ruby jruby ruby-1.9
如果函数作为lambda存储在变量中,是否可以调用函数(发送消息)对象?
说我有一个类似的数组 %w(a b c)
然后我可以链接方法,如:
%w(a b c).reverse.map(&:upcase) # => ["C", "B", "A"]
Run Code Online (Sandbox Code Playgroud)
是否可以将链式方法调用提取到变量并将其应用于其他数组对象?
transform = -> { reverse.map(&:upcase) }
Run Code Online (Sandbox Code Playgroud)
我试过以下但没有运气:
使用JRuby 1.7.1
%w(a b c).send(transform)
TypeError: #<Proc:0x19a639d8@(irb):12 (lambda)> is not a string
Run Code Online (Sandbox Code Playgroud)
和
%w(a b c).send(&transform)
ArgumentError: wrong number of arguments (0 for 1)
Run Code Online (Sandbox Code Playgroud)
使用Ruby 1.9.3
%w(a b c).send(transform)
TypeError: #<Proc:0x007fa0721f0dc8@(irb):1 (lambda)> is not a symbol
Run Code Online (Sandbox Code Playgroud)
和
%w(a b c).send(&transform)
ArgumentError: no method name given
Run Code Online (Sandbox Code Playgroud)
我看到至少两种方法:
1)你似乎喜欢用隐式接收器编写lambda(我不推荐它,self显然会改变),你有instance_exec:
transform = -> { reverse.map(&:upcase) }
["a", "b", "c"].instance_exec(&transform)
#=> ["C", "B", "A"]
Run Code Online (Sandbox Code Playgroud)
2)编写自定义扩展,例如Object#apply:
class Object
def apply(block, *args)
block.call(self, *args)
end
end
transform = -> strings { strings.reverse.map(&:upcase) }
["a", "b", "c"].apply(transform)
#=> ["C", "B", "A"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |