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


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

简单ruby问题

Ruby代码   sE]eIN  
class A   /V:%}Z  
extend self   !/Hln;{  
def a   Vs m06Rj{  
'a'   @4hxGk=  
end   u V=rLDY  
end   t+p-,ey^@  
A.a #=> 'a'   ^> ZQ:xs@(  
hnH:G`[F  
为什么好使呢,代码不是按顺序执行的吗? SlsMMD  
求解答
此帖悬赏中(剩余时间:已结束)...
最佳答案: 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 Sn+F V+D  
.O;!W<Ef$  
1Q0%7zRirI  
Extend亦称扩展,为目标类添加相应的类方法。 d~vTD| Et  
或extend会把module的实例方法作为类方法加入类
级别: 北风资深评论员


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

我执行怎么直接报错? Te;gVG*  
k^^:;OR  
Ruby代码   2/@D7>F&g  
TypeError: wrong argument type Class (expected Module)   I_?He'=0oU  
    from (irb):22:in `extend'   2Pp&d>E4  
    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是为目标类添加类方法。 38i,\@p`9$  
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。 z-gG(  
v*'\w#  
Ruby代码   ~1sl.8tF  
module A   l}c2l'  
extend self   %=y3  
def a   1G.gPx[  
'a'   |/s2AzDD  
end   2tm-:CPG  
end   I]1Hi?A2  
A.a #=> 'a'   ^VPl>jTg  
,s&~U<Z  
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。 o;_bs~}y  
一个简单的例子,从网上找的。 Hd`p_ ?3]  
Ruby代码   #2ASzCe  
module Foo   tN> B$sv  
def foo   )^f Q@C8  
puts 'heyyyyoooo!'   fhx:EZ:~  
end   }px]   
end   ;I71_>m  
   [=3tAPpzK  
class Bar   5?0gC&WfN  
include Foo   v1g5(  
end   yUwgRj  
   q'@Ei4  
Bar.new.foo # heyyyyoooo!   )Hm[j)YI  
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class   &})d%*n  
   '?3z6%  
class Baz   e4%*I8 ^e  
extend Foo   7qK0!fk5  
end   G5y  
   AeCG2!8^0  
Baz.foo # heyyyyoooo!   -7z y  
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||

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