Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby方法、过程和块混淆_Ruby - Fatal编程技术网

Ruby方法、过程和块混淆

Ruby方法、过程和块混淆,ruby,Ruby,我对Ruby的方法、过程和块有几个问题,这些问题让我觉得很奇怪。与其说是语法或功能,不如说是决策背后的逻辑 问题1: 为什么块可以传递给方法(例如each),但不能分配给变量 我知道你可以在过程中传递它们,例如,p=Proc.new{…}(通过&p访问),但是让程序员通过这些方法没有多大意义 问题2: 为什么方法和程序之间有区别 例如,我可以通过以下两种方式完成定义函数和调用该函数的任务: def square(x) x**2 end square(3) => 9 或 为什么会

我对Ruby的方法、过程和块有几个问题,这些问题让我觉得很奇怪。与其说是语法或功能,不如说是决策背后的逻辑

问题1:

为什么块可以传递给方法(例如each),但不能分配给变量

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

问题2:

为什么方法和程序之间有区别

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

def square(x)
    x**2
end

square(3)
=> 9


为什么会出现这种差异?例如,在Python中,以标准方式定义函数和通过
square=lambda x:x**2
完成创建函数并将其分配给
square

的相同任务问题1:块不是对象,它们是语法结构;这就是为什么不能将它们指定给变量。这是为对象保留的特权

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


proc和lambda是对象,因此它们可以接收
调用
消息并分配给名称。总而言之,正是作为一个对象,procs和lambda的行为方式让您感到奇怪。方法和块不是对象,也不共享该行为。

方法是方法-也就是说,它们是对象可以响应消息的操作。它们不是函数

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


在某些语言中,方法只是作为对象成员的函数,但Ruby并不这样看待它们。将一个方法与其说是简单的赋值,不如说是将它从它所拥有的对象中分离出来更像是外科手术。Ruby的面向对象模型来自现代OO的鼻祖。

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

ABC类
定义某些方法
结束
结束
ABC.instance_method(:some_method)#=>#
除此之外,还有一个内置类:方法,如文档所示

另见:

它似乎很随意地证明了一切都是客观事物。在这种特殊情况下,似乎需要更多的挖掘才能看到


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

Ruby声称一切都是对象。为了适应这种情况,块应该是对象,并且它们可以作为参数传递,因此它们在某些方面的行为肯定类似于对象。可以通过创建一个对象来表示它们,即proc或lambda,使块的行为类似于对象。没有这个设备,它们只是语法结构。有块对象——这就是lambda{whatever}的目的。lambda是proc的一种特殊形式。查看Ruby编程语言的第192页:这个解释是有道理的,尽管我不一定看到这些选择的合理性。这些选择仅仅是为了尊重有影响力的语言(如smalltalk)的惯例吗?方法似乎将其对象性作为
Proc
的实例。在
方法的
ri
文档中,解释中没有使用“方法”一词,而是使用了“过程”。这两个类接收相同的消息,但不同之处在于它们的调用方式以及方法是在另一个对象的命名空间中定义的,其中proc需要接收
调用
方法,以便被调用并独立于其他对象存在(如前所述,持久化)。啊,另一个区别<代码>方法
不接收
新建
消息,其中
Proc
接收。如果方法是对象,它们就不是完全意义上的对象(“full”意思是具有我们习惯于在对象中看到的所有特征)。wikibooks链接很有帮助。谢谢。这个答案值得更多的投票。被接受的答案无助于解决困惑,这就纠正了问题。
square = lambda {|x| x**2}
square.call(3)
=> 9
class ABC
  def some_method
  end
end
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method>