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


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

简单ruby问题

Ruby代码   IN=pki |.  
class A   <"A|Xv'Q  
extend self   x{4Rm,Dxn  
def a   rMXIw  
'a'   'F%4[3a$\n  
end   {Hncm  
end   4w,=6|#  
A.a #=> 'a'   HUqG)t*c1  
3jF#f'*  
为什么好使呢,代码不是按顺序执行的吗? r /v'h@  
求解答
此帖悬赏中(剩余时间:已结束)...
最佳答案: 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 )NF5,eD  
gm^j8  B  
p]jkfsCjN  
Extend亦称扩展,为目标类添加相应的类方法。 hZZ  
或extend会把module的实例方法作为类方法加入类
级别: 北风资深评论员


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

我执行怎么直接报错? Z#L4n#TT  
qSB&Q0T  
Ruby代码   -PAEJn5$O  
TypeError: wrong argument type Class (expected Module)   CDRbYO  
    from (irb):22:in `extend'   nAEyL+6U  
    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是为目标类添加类方法。 y9l.i@-  
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。 <PuB3PEvV  
,VcD vZ7  
Ruby代码   "3>*i!i  
module A   po](6V  
extend self   ba)YbP[  
def a   (gJ )]/n  
'a'   9'*ZEl^?D  
end   U(&nh ?  
end   ek. WuOs  
A.a #=> 'a'   A%czhF  
!O-_Dp\#  
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。 LK-6z w5=(  
一个简单的例子,从网上找的。 p31rhe   
Ruby代码   R_*D7|v  
module Foo   /5'<w(  
def foo   a]=vq(N'r  
puts 'heyyyyoooo!'    AqKx3p6  
end   8JOht(m  
end   pZJQKTCG  
   byj mH  
class Bar   w wRT$-!  
include Foo   }GNH)-AG)$  
end   W yJfF=<  
   uV$d7(N}"  
Bar.new.foo # heyyyyoooo!   ysT!^-&p  
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class   C`T5d  
   |3lAye,t)a  
class Baz   }b\q<sNE{  
extend Foo   OZ0%;Y0  
end   Dt'e<d Is  
   W9m[>-Ew  
Baz.foo # heyyyyoooo!   :yFCp@&  
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||

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