class foo def bar end end foo.new.bar
类是方法和数据的集合,class 里定义的应该是一个 bar 方法。但是调用的时候为什么经常说是发送一个消息 bar 给 foo 的实例?
抽象概念而已,来源于 smalltalk,其实怎么说都可以。
ruby 有个方法 send,可以这样调用一个方法
foo.new.send :bar
如果理解为消息就觉得这个方法很贴切了。
a.b 就是给 receiver a 发送消息 b,至于消息怎么处理再涉及到 eigen class 的方法查找,找到方法后 receiver a 被绑定到 self 并调用方法。可以理解为方法是消息的 handler
a.b
receiver
b
self
handler
#1 楼 @Rei 恩 还有个问题,ruby 类中的数据是不是都封装在内部,不能比如在
def bar @name="computer" end
这里的 name 不能直接 foo.new.name 访问,必须得定义一个方法
#3 楼 @jiffies 是的。对象后面加点调用的都是方法。
#3 楼 @jiffies 1 我的理解是这样的,静态的叫方法,需要动态寻找的叫消息。 c/c++/java 的方法偏移地址在编译时可以确定,叫方法调用。 ruby/objc的方法偏移地址是需要运行时动态寻找的,理解为向对象发送消息更好。
2 类中是不包含你所说的数据的,只包含在类的实例中。
我认为这是一种更加面向对象的说法,发送消息和方法调用看起来似乎没什么区别,但是以消息的角度来理解,可能更能写出符合语境的代码。例如
class Person def say(something) puts something end end tom = Person.new tom.say 'Hello world!'
从上面例子,发say消息给tom,叫tom说出“helllo world!”。这样更觉起来更加的面向对象,这对改变我们的思维,写出漂亮的代码有帮助。
say
tom