Ruby方法,Proc和块混淆

我有几个关于Ruby的方法,程序和块的问题让我觉得很奇怪。 它们与语法或function的关系不如决策背后的逻辑。

问题1:

为什么块可以传递给方法(例如每个)但是它们不能分配给变量?

我知道你可以在程序中传递它们,即p = Proc.new {...} (用&p访问),但让程序员通过这些方法没有多大意义。

问题2:

为什么方法和程序之间存在差异?

例如,我可以通过以下两种方式完成定义函数和调用该函数的任务:

 def square(x) x**2 end square(3) => 9 

要么

 square = lambda {|x| x**2} square.call(3) => 9 

为什么要分化? 例如,在Python中,以标准方式和square = lambda x: x**2定义函数,完成创建函数并将其赋值为square的相同任务。

问题1:块不是对象,它们是句法结构; 这就是他们无法分配给变量的原因。 这是为对象保留的权限。

问题2:方法不是对象,因此无法接收消息。 相反,procs和lambdas是对象,因此它们不能像方法一样调用,但必须接收一条消息,告诉它们根据随消息传递的参数返回一个值。

Procs和Lambdas是对象,因此它们可以接收call消息并分配给名称。 总而言之,它是一个使procs和lambdas以你发现奇怪的方式行为的对象。 方法和块不是对象,也不共享该行为。

至少在某种程度上,方法对象:

 class ABC def some_method end end ABC.instance_method(:some_method) #=> # 

除此之外,还有一个内置类:Method,如此处所述 。

另见: http : //en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

,它确实似乎证实了一切都是对象的东西。 在这种特殊情况下,它似乎需要更多的挖掘才能看到。

(我真的必须努力更好地理解这一点:我开始认为这是获得更深入理解的基础。)

方法是方法 – 也就是说,它们是对象可以响应消息的动作。 它们不是function。

块是闭包 – 它们是封闭范围内的函数。 它们在概念上不属于“属于”给定对象。

在某些语言中,方法只是作为对象成员的函数,但Ruby不会以这种方式查看它们。 将方法与其拥有的对象分开更类似于手术而不是简单的分配。 Ruby从现代OO的祖父Smalltalk获取其面向对象模型。