如何在不使用.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中内置的该名称的方法混淆. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |