今天看到一句话 为理解 python 的 self,不妨对比一下 ruby 和 javascript。ruby 的方式是方法不是一级对象,所以绕过了这个问题(python 的类方法为什么要写一个 self 参数)。
关于一级对象 http://en.wikipedia.org/wiki/First-class_object
我看 ruby 好像可以在运行时,创建方法。到底是不满足哪一条,才不能称作一级对象。 初学 ruby,对一些概念还不很理解。谁能解释一下吗? 谢谢。
只是取出来的写法不同而已:a.method :f
python / js 的 a.f()
其实是两个操作:取方法对象,然后 apply
ruby 的 a.f()
是一个操作:发消息
ruby 是有 eigen class 就从自身取,取不到就从 class 取,再取不到就搜 super class / module ... js 是从自身取,取不到就从 prototype 取,再取不到就到 prototype 的 prototype 取...
实例的方法对象,都是 class / prototype 上的 "函数指针" + 实例 (self) 的组合,函数体都只存一份的,但方法对象都有绑定的实例。
#6 楼 @ekim_sgra 其实解释器怎么做你是管不了的... rubinius 里某些方法调用就不用经过 1)
你可以按这两步理解 js/python, 但是不能这么理解 ruby, 它们是不同的
各人喜好吧。我就讨厌写括号
#6 楼 @ekim_sgra 我觉得不是因为你说的原因,而是 ruby 太强调面向对象才导致函数不是第一公民,不知道这点是不是跟 smalltalk 学的? 表示就算不小心写了括号都要删掉。。
#6 楼 @ekim_sgra 再提一点不同
就算强制括号,a.f
取方法对象在 ruby 中也是行不通的。因为 ruby 实现了元对象协议的动态分派 (dynamic dispatch) -- 调用的时候可能方法根本就还没定义,但这个 dispatch 还是有可能跑到 method_missing
中并成功返回的。用先取后调的语义去理解 a.f()
还是不合逻辑。
有得必有失,在我看来 a.method :f
的能用的地方没有动态分派用在 DSL 的地方多...