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
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.
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中不是这种情况,但它可以近似.
| 归档时间: |
|
| 查看次数: |
9538 次 |
| 最近记录: |