简单ruby问题(关于extend)

[code="ruby"]
class A
extend self
def a
'a'
end
end
A.a #=> 'a'
[/code]
为什么好使呢,代码不是按顺序执行的吗?
求解答

orcl_zhang其实已经说明了你的问题。
我再啰嗦一下:
当你exends self的时候,就将self加入到了A的父类列表通过A.ancestors可以看得很清楚。[color=red]尽管现在A其实没有定义a方法,这个没关系。目前为止所做的事情就是“认了一个干爹”,至于“干爹”有什么,还不知道[/color]。
当A调用a方法的时候,发现自己没有;就往它干爹那儿找,一看,结果找到了,就直接拿来用了,于是就有了A.a方法

看看类似于java this但跟this有点区别的self的使用:http://ilstar.blogbus.com/logs/59782933.html

Extend亦称扩展,为目标类添加相应的类方法。
或extend会把module的实例方法作为类方法加入类
看看这:http://www.cnblogs.com/rubylouvre/archive/2010/03/31/1701813.html

我执行怎么直接报错?
[code="ruby"]
TypeError: wrong argument type Class (expected Module)
from (irb):22:in `extend'
from (irb):22
[/code]

简单的来说,(包含)include是为目标类添加实例方法,而(扩展)extend是为目标类添加类方法。
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。
[code="ruby"]
module A
extend self
def a
'a'
end
end
A.a #=> 'a'
[/code]
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。
一个简单的例子,从网上找的。
[code="ruby"]
module Foo
def foo
puts 'heyyyyoooo!'
end
end

class Bar
include Foo
end

Bar.new.foo # heyyyyoooo!
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class

class Baz
extend Foo
end

Baz.foo # heyyyyoooo!
Baz.new.foo # NoMethodError: undefined method ‘foo’ for #BAZ:0X1E708
[/code]
你也可以参考论坛里的帖子。http://vincent253.iteye.com/blog/135213

    要理解Ruby中方法查找的机制:one step right;up