如果没有圆括号前面的点,为什么Ruby 1.9 lambda调用不可能?

Geo*_*Geo 19 ruby lambda first-class-functions ruby-1.9

我查看了最新的Ruby版本,以便对最新的更改进行一些调整.我尝试做的第一件事是调用Ruby lambda/block/proc就像你使用Python可调用一样.

a = lambda {|x| puts x}
a.call(4) # works, and prints 4
a[4] # works and prints 4
a.(4) # same
a(4) # undefined method 'a' for main:Object
Run Code Online (Sandbox Code Playgroud)

为什么最后一次通话不可能?它会永远吗?

hor*_*guy 10

AFAIK是因为ruby不允许您()为对象定义方法.它不允许您定义()方法的原因可能是由于括号在方法调用中是可选的.

为了它的价值,这是一个让你使用http://github.com/coderrr/parenthesis_hacks/blob/master/lib/lambda.rb调用lambdas的黑客攻击()


J C*_*per 6

Ruby基本上是100%面向对象的,但有时它会试图隐藏这个事实......方便吗?熟悉?

基本上,"在顶层"定义的函数实际上被定义为全局对象上的方法.为了实现这一点,没有说明符的调用实际上转换为在所述全局对象上调用具有该名称的方法.这种风格使事物看起来更像脚本.Ruby正试图用你的最后一个例子做到这一点.

前两个示例解析正常,因为Ruby知道您正在尝试访问proc对象的方法 - 记住甚至[]只是您可以定义的方法.具有显式点的那个也有效,因为点表示"将此消息发送到此对象"(在本例中a).

我知道这不会"解决"任何事情,但我希望它有所帮助.