Ruby中的方法:对象与否?

Mla*_*vić 43 ruby methods language-features object

受到这种讨论的启发,经过一些谷歌搜索后,我无法找到关于Ruby方法的一个非常简单的问题的答案:方法对象与否?

这里那里有不同的意见,我真的想听听,比方说,深入解释.

我知道Object#method方法,它接受一个方法名称并返回一个Method实例,但另一方面,你可以用块做类似的事情来使它们成为Proc实例,而块不是对象,所以是什么使得方法有什么不同?

JRL*_*JRL 61

方法是Ruby语法的基本部分,但它们不是Ruby程序可以操作的值.也就是说,Ruby的方法不是字符串,数字和数组的对象.但是,有可能获得表示给定方法的Method对象,并且我们可以通过Method对象间接调用方法.

来自Ruby编程语言:
替代文字http://ecx.images-amazon.com/images/I/517LDwIEYwL._SL75_.jpg

  • `hi.object_id`首先调用方法`hi`,然后返回其结果的object_id(字符串`"hello"`). (11认同)

Jör*_*tag 18

你无法真正说出来.

访问方法的唯一方法是将#method消息发送到某个对象,然后返回一个Method对象.但Method这个方法本身就是对象吗?或者它是该方法的包装?或者它是原始方法的转换版本?

你无法知道:如果你想看一个方法,你必须打电话#method,此时你肯定得到一个对象.你打电话给#method之前它无法看到,因此你无法分辨.

几个数据点:在Ruby中,一切都返回一个值.什么def回报?它总是返回nil,而不是Method对象.而且define_method?它返回a Proc,但不是a Method(也不是UnboundMethod).[注意:在Rubinius中,def返回方法的编译字节码,但仍然不是Method对象.]

如果你看一下Ruby语言规范的第6.1(29-34行和1-5的5页和第6),你可以清楚地看到,有方法和对象之间有区别的的第4和第5段.如果你看一下内置类的规范,你会发现,无论是Method也不UnboundMethod是没有,也不是Object#method.IOW:您可以构建一个完全符合标准的Ruby解释器,其中方法不是对象.

现在,块OTOH肯定不是对象.有许多方法来构建 Proc从块的对象,然后具有相同的行为与原始块(lambda,proc,Proc.new,的&印记),但块本身不是对象.

可以这样考虑一下:你可以传递一个字符串来File.new构造一个文件对象,但这不会使一个字符串成为一个文件.您可以传递一个块来Proc.new构造一个proc对象,但这不会使一个块成为一个proc.

  • 不想听起来讽刺,但是什么是块?它只是.rb文件中的一段文字吗? (2认同)

yfe*_*lum 11

在Ruby中,方法和块本身不是本机或第一类对象.然而,它们可以非常容易地包裹在物体中,这样它通常没有区别.

但试试,并记住结果,

a = Object.method(:new).object_id
b = Object.method(:new).object_id
a == b
=> false
Run Code Online (Sandbox Code Playgroud)

在Haskell中,所有值(包括数字以及lambda和函数)都是一等值.在语言的每个方面,它们都被等同地对待.在Ruby中不是这种情况,但它可以近似.