Ruby 如何将方法或lambda转换为非lambda proc
如下面的ruby示例所示,我不能将参数数量错误的Ruby 如何将方法或lambda转换为非lambda proc,ruby,lambda,proc,Ruby,Lambda,Proc,如下面的ruby示例所示,我不能将参数数量错误的lambda调用为从方法创建的Proc,因为它对参数数量要求严格: # method with no args def a; end instance_eval(&method(:a)) # ArgumentError: wrong number of arguments (1 for 0) method(:a).to_proc.call(1, 2, 3) # ArgumentError: wrong number of argumen
lambda
调用为从方法创建的Proc
,因为它对参数数量要求严格:
# method with no args
def a; end
instance_eval(&method(:a))
# ArgumentError: wrong number of arguments (1 for 0)
method(:a).to_proc.call(1, 2, 3)
# ArgumentError: wrong number of arguments (3 for 0)
method(:a).to_proc.lambda?
# => true
如何从Proc
或方法中获取不是lambda的Proc
除了参数传递之外,我想知道您对方法中的返回有什么期望。它只能以lambda
的方式运行
如果你真的必须这样做,你需要建立自己的区块,例如
Proc.new{ a }
对于更通用的方法,您必须检查该方法的arity
,并仅传递所需的参数。尝试将其包装在非lambda过程中,如下所示:
l=lambda{a,b}放置“a:{a},b:{b}”
p=proc{a,b{l.call(a,b)}
l、 兰姆达?
#=>正确
l、 一致性
#=> 2
l、 呼叫(“海”)
#=>ArgumentError:参数数量错误(1代表2)
l、 呼叫(“hai”、“bai”、“weee”、“womp”、“woo”)
#=>ArgumentError:参数数量错误(5代表2)
p、 兰姆达?
#=>错误
p、 一致性
#=> 2
p、 呼叫(“海”)
#=>a:hai,b:
p、 呼叫(“hai”、“bai”、“weee”、“womp”、“woo”)
#=>a:hai,b:bai
将Lambda
转换为Proc
下面是一个变通方法,它将lambda
或方法
调用封装在Proc
中,并使用splat处理任意数量的参数:
# method with no args
def a; end
instance_eval(&method(:a))
# ArgumentError: wrong number of arguments (1 for 0)
method(:a).to_proc.call(1, 2, 3)
# ArgumentError: wrong number of arguments (3 for 0)
method(:a).to_proc.lambda?
# => true
def lambda_to_proc(lambda)
Proc.new do |*args|
diff=lambda.arity-args.size
如果差异为负,差异=0?
args=args.concat(Array.new(diff,nil)).take(lambda.arity)
lambda.call(*args)
结束
结束
无论传递的参数数量如何,这始终有效;额外的参数将被删除,nil
将替换缺少的参数
示例:
带有两个参数的lambda
一些λ=->(a,b){[a,b]}
#不带参数的方法
def一些_方法;“你好!”;结束
lambda_to_proc(一些lambda)。调用(5)
#=>[5,零]
lambda_to_proc(方法(:some_方法))。调用(1,2,3)
#=>“你好!”
注意:没有直接的方法将lambda或方法调用转换为proc。这只是一种变通方法,显然比实际操作慢(因为将一个调用包装到另一个调用中)。据我所知,您无法将方法或lambda转换为非lambda过程。你想实现什么?@Wallyatman一个块的调用语义,最重要的是关于参数的数量,但是还有一些其他的区别。我想这不太可能,因为返回
,下一步
和中断
,作为一种临时措施,我要么用splat编写方法,要么让它们返回Proc
。有没有办法证明这是不可能的?@michelpm:没有证据,对不起。请记住,如果你的lambda
可以使用默认参数,那么这是行不通的。例如,some_lambda=->(a,b=0){[a,b]}
在使用lambda\u调用\u proc
时引发ArgumentError
。解决方法之一是使用lambda.parameters.length
而不是lambda.arity
。