Ruby 如何将方法或lambda转换为非lambda proc

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

如下面的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 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