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


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

简单ruby问题

Ruby代码   = Mc]FCV  
class A   22?9KZ`Z=  
extend self   _"`wUMee  
def a   % ~%>3  
'a'   ~g2ColFhu  
end   ,wmPK;j  
end   Hl&]r'bK  
A.a #=> 'a'   45` Gv  
UQz8":#V  
为什么好使呢,代码不是按顺序执行的吗? QsYc 9]:  
求解答
此帖悬赏中(剩余时间:已结束)...
最佳答案: 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 !;ipLC;e}  
eFiUB  
4:S?m(ah/  
Extend亦称扩展,为目标类添加相应的类方法。 ,@]rvI6 x  
或extend会把module的实例方法作为类方法加入类
级别: 北风资深评论员


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

我执行怎么直接报错? b?p_mQKtZ  
Jj~c&LxrO  
Ruby代码   'q#$^ ='o  
TypeError: wrong argument type Class (expected Module)   W' DpI7  
    from (irb):22:in `extend'   L=7 U#Q/DE  
    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是为目标类添加类方法。 9/\=6v C|  
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。 T/7[hj  
H~qY7t  
Ruby代码   !I8( Y  
module A   TLzcQ|  
extend self   E}w<-]8  
def a   -E!V;Tgc%U  
'a'   ;/nR[sibN  
end   fI(H : N  
end   A7 :W0Gg  
A.a #=> 'a'   3412znM&  
Neb%D8/Kn  
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。 785Y*.p  
一个简单的例子,从网上找的。 q} R"  
Ruby代码   yYTiAvN  
module Foo   z//6yr  
def foo   4~r=[|(aY  
puts 'heyyyyoooo!'   >G+?X+9  
end   ?3i-wpzMp  
end   0ID 8L [  
   8eoDE. }  
class Bar   )6mv 7M{  
include Foo   xF{<-b  
end   dTP$7nfe  
   ,Gd8 <  
Bar.new.foo # heyyyyoooo!   WaWx5Fx+  
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class   ffyKAZ{]po  
   1k>*   
class Baz   0)qLW& w  
extend Foo   p.1|bXY`  
end   {/ _.]Vh  
   D &w m7,  
Baz.foo # heyyyyoooo!   `ml;#n,*  
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||

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