将方法存储在lambda中并发送到对象

问题描述 投票:4回答:2

如果函数作为lambda存储在变量中,是否可以调用函数(发送消息)对象?

说我有像%w(a b c)这样的数组

然后我可以链接方法,如:

%w(a b c).reverse.map(&:upcase) # => ["C", "B", "A"] 

是否可以将链式方法调用提取到变量并将其应用于其他数组对象?

transform = -> { reverse.map(&:upcase) }

我试过以下但没有运气:

使用JRuby 1.7.1

%w(a b c).send(transform)
TypeError: #<Proc:0x19a639d8@(irb):12 (lambda)> is not a string

%w(a b c).send(&transform)
ArgumentError: wrong number of arguments (0 for 1)

使用Ruby 1.9.3

%w(a b c).send(transform)
TypeError: #<Proc:0x007fa0721f0dc8@(irb):1 (lambda)> is not a symbol

%w(a b c).send(&transform)
ArgumentError: no method name given
ruby jruby ruby-1.9
2个回答
8
投票

我看到至少两种方法:

1)你似乎喜欢用隐式接收器写lambdas(我不推荐它,self显然会改变),你有instance_exec

transform = -> { reverse.map(&:upcase) }
["a", "b", "c"].instance_exec(&transform)
#=> ["C", "B", "A"]

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"]

0
投票
class Array
  def transform; reverse.map(&:upcase) end
end

%w(a b c).send(:transform)
© www.soinside.com 2019 - 2024. All rights reserved.