我可以使用Ruby从内部引用lambda吗?

Edd*_*gan 20 ruby lambda block

我希望能够使用Ruby从内部调用匿名lambda.考虑以下递归块(返回阶乘).我知道我可以将它分配给变量,并且该变量在lambda的范围内:

fac = lambda { |n| n == 1 ? 1 : n * fac.call(n - 1) }
fac.call(5)
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够做到以下(因为没有实际原因,我只是对探索语言感兴趣):

(lambda { |n| n == 1 ? 1 : n * self.call(n - 1) }).call(5)
Run Code Online (Sandbox Code Playgroud)

我知道self是行不通的,因为是main对象.我做错了吗?我试图做一些不可能的事情 - 如果不是,这是因为某些理论上的限制还是仅仅是在Ruby中没有实现?

myd*_*rms 9

在下面的示例中,lambda仍然是匿名的,但它有一个引用.(那是匿名吗?)

(l = lambda { l.call }).call
Run Code Online (Sandbox Code Playgroud)

(感谢Niklas B.指出我原来的答案中的错误;我只在IRB中进行过测试,并在那里工作).

这当然以SystemStackError: stack level too deep错误结束,但它证明了目的.


meg*_*gas 6

似乎匿名函数确实没有任何参考.您可以通过被叫方查看

lambda{ __callee__ }.call #=> nil
Run Code Online (Sandbox Code Playgroud)

如果没有参考,你就无法调用此功能.我可以向你求一个更干净的变体:

(fac = lambda{ |n| n==1 ? 1 : n*fac.call(n-1) }).call(5)
Run Code Online (Sandbox Code Playgroud)


小智 5

fact = -> (x){ x < 2 ? 1 : x*fact.(x-1)}
Run Code Online (Sandbox Code Playgroud)

最小功能

  • @pjs 大多数时候括号优于方括号。原因很简单,因为方括号主要表示对数据的访问(数组、散列、结构体等)。使用括号清楚地表明您正在调用方法/proc/lambda。方括号的使用并没有错,但可能会误导不知情的代码阅读者。 (3认同)