加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 在lambda中存储方法并发送给对象

发布时间:2020-12-17 03:39:13 所属栏目:百科 来源:网络整理
导读:如果函数作为lambda存储在变量中,是否可以调用函数(发送消息)对象? 假设我有一个像%w(a b c)这样的数组 然后我可以链接方法,如: %w(a b c).reverse.map(:upcase) # = ["C","B","A"] 是否可以将链式方法调用提取到变量并将其应用于其他数组对象? transfor
如果函数作为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

解决方法

我看到至少两种方法:

1)你似乎喜欢用隐式接收器编写lambdas(我不推荐它,自我明显改变),你有instance_exec:

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

2)编写自定义扩展,例如Object#apply:

class Object
  def apply(block,*args)
    block.call(self,*args)
  end
end

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读