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

如何在不使用.call的情况下使用参数从lambda创建lambda?

发布时间:2020-12-17 03:01:53 所属栏目:百科 来源:网络整理
导读:我想创建一个新的lambda,不带lambda取一个参数. 说,我有 irb(main):001:0 f1 = lambda { |p| p }= #Proc:0x00000001045190@(irb):1 (lambda)irb(main):002:0 f1.call(2)= 2 而现在我 irb(main):003:0 f2 = lambda { f1.call(2) }= #Proc:0x00000000f620e8@(i
我想创建一个新的lambda,不带lambda取一个参数.

说,我有

irb(main):001:0> f1 = lambda { |p| p }
=> #<Proc:0x00000001045190@(irb):1 (lambda)>
irb(main):002:0> f1.call(2)
=> 2

而现在我

irb(main):003:0> f2 = lambda { f1.call(2) }
=> #<Proc:0x00000000f620e8@(irb):3 (lambda)>
irb(main):004:0> f2.call
=> 2

但是我不想在第一个附近创建一个lambda但是想要为它或其他东西“替换”参数.

可能如果我们有调用,有一些魔法与调用相同,但返回lambda除了实际调用代码:

f2 = f1.some_magic(2)
f2.call
=> 2

附:对不起,如果这个问题很愚蠢,有时我很难理解这个功能性的东西.

P.P.S.在ruby-forum.com上找到this topic,似乎我想做同样的事情,没有不必要的调用开销.

解决方法

您可以创建一个将参数绑定到proc的函数.这适用于Ruby> = 1.8:

def bind_args(l,*bound_args)
  lambda { |*unbound_args|
    l[*(bound_args + unbound_args)]
  }
end

正在使用:

f1 = lambda { |p| p }   
f2 = bind_args(f1,2)
p f2.call
# 2

如果你想绑定一些但不是所有的参数,你也可以这样做:

f1 = lambda { |p,q| [p,q] }
f2 = bind_args(f1,2)
p f2.call(3)
# [2,3]

除非curry发出一个调用而不是一个新的lambda,如果给lambda的完整参数绑定,这几乎就是curry所做的.我没有把它称为咖喱,以避免与Ruby 1.9中内置的该名称的方法混淆.

(编辑:李大同)

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

    推荐文章
      热点阅读