上一主题下一主题
关键字
主题 : 简单ruby问题
级别: 北风技术菜鸟


UID: 472199
精华: 0
发帖: 1537
威望: 4830 点
学点: 3710 点
贡献: 180 点
好评: 0 点
学币: 15 个
注册时间: 2014-07-08
最后登录: 2015-04-06
楼主  发表于: 2015-02-23 14:03||

简单ruby问题

Ruby代码   kX8Ey  
class A   ..a@9#D  
extend self   L[a A4`  
def a   #-{^={p "  
'a'   t}x^*I$*  
end   vL ]z3  
end   ;/s##7qf  
A.a #=> 'a'   >V|KS(}s  
yD:}&!\}  
为什么好使呢,代码不是按顺序执行的吗? :9Mqwgk,;3  
求解答
此帖悬赏中(剩余时间:已结束)...
最佳答案: 2 学点
热心助人剩余点数: 1 学点
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
沙发(1楼)  发表于: 2015-02-23 14:08||

看看类似于j****a this但跟this有点区别的self的使用:http://ilstar.blogbus.com/logs/59782933.html oK[,xqyA  
:|( B[  
}('QIvq2  
Extend亦称扩展,为目标类添加相应的类方法。 e.h:9` "*  
或extend会把module的实例方法作为类方法加入类
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
板凳(2楼)  发表于: 2015-02-23 14:08||

我执行怎么直接报错? ,'0oj$~S:  
~\(>m=|C:H  
Ruby代码   C4K&flk]  
TypeError: wrong argument type Class (expected Module)   WYd,tGz  
    from (irb):22:in `extend'   |gxB; GG  
    from (irb):22  
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
地板(3楼)  发表于: 2015-02-23 14:09||

简单的来说,(包含)include是为目标类添加实例方法,而(扩展)extend是为目标类添加类方法。 pg*'2AT  
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。 +z;xl-*[  
BxO2w1G  
Ruby代码   ,LWM}L  
module A   8+v6%,K2  
extend self   Z(*n ZT,  
def a   =5I1[p;  
'a'   cV)fe`Gg  
end   (al7/EhY  
end   DV*8Mkzg  
A.a #=> 'a'   noh3mi  
VlXIM,  
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。 VH,k EbJ  
一个简单的例子,从网上找的。 J0mY=vX  
Ruby代码   d q"b_pr;  
module Foo   BAdHGwomh  
def foo   ~ E>D0o  
puts 'heyyyyoooo!'   L'"20=sf  
end   )|uPCZdLZ  
end   I2YQIY+  
   J>] ' {!+  
class Bar   /M v\~vg$1  
include Foo   H:d{Sru  
end    @*%Q,$  
   >OZ+k(saL  
Bar.new.foo # heyyyyoooo!   V|#B=W  
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class   `Ft`8=(  
   P}DrUND  
class Baz   5}e-\:J >B  
extend Foo   :v1'(A1t  
end   XuoI19V[  
   WI[6 l6  
Baz.foo # heyyyyoooo!   <)?H98S  
Baz.new.foo # NoMethodError: undefined method ‘foo’ for #<BAZ:0X1E708>  
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
地下室(4楼)  发表于: 2015-02-23 14:09||

要理解Ruby中方法查找的机制:one step right;up
级别: 北风资深评论员


UID: 471051
精华: 0
发帖: 5449
威望: 7518 点
学点: 8435 点
贡献: 216 点
好评: 0 点
学币: 116 个
注册时间: 2014-07-03
最后登录: 2015-04-06
下水道(5楼)  发表于: 2015-02-23 14:09||

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