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

我查看了最新的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 

为什么不能进行最后一次通话? 会不会是?

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

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

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

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

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

我知道这不会“解决”任何问题,但我希望它有所帮助。