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


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

简单ruby问题

Ruby代码   C*<LVW{P  
class A   1yf&ck1R  
extend self   ymqhI\>y#  
def a   (ZJ_&8C#  
'a'   93,ExgFt  
end   % M:"Ai5:  
end   Rh^$0Q*2  
A.a #=> 'a'   dD!SgK[Jv  
3e:y?hpeL  
为什么好使呢,代码不是按顺序执行的吗? eIl&=gZ6>  
求解答
此帖悬赏中(剩余时间:已结束)...
最佳答案: 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 (At$3b6  
1H9!5=Ff  
~G w*r\\+  
Extend亦称扩展,为目标类添加相应的类方法。 ABkl%m6xf  
或extend会把module的实例方法作为类方法加入类
级别: 北风资深评论员


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

我执行怎么直接报错? kYbqb?  
z$64Ep#  
Ruby代码    cs+;ijp  
TypeError: wrong argument type Class (expected Module)   +2:\oy}!8  
    from (irb):22:in `extend'   2 IfcdYG  
    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是为目标类添加类方法。 m%zo? e  
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。 C7*n<+e  
JfD-CoQS'  
Ruby代码   "5<:Dj/W  
module A   i>z_6Gax*[  
extend self   eH HY.^|  
def a   a-e_q  
'a'   riR(CJ}Ff  
end   &Va="HNKt  
end   yY[9\!  
A.a #=> 'a'   $%BI8_  
tGE=!qk  
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。 {wy{L-X  
一个简单的例子,从网上找的。 :HW| mqKd  
Ruby代码   [Ef6@  
module Foo   e5RF6roxO  
def foo   u9nJ;:  
puts 'heyyyyoooo!'   y1{TVpN  
end   Sq&r ;  
end   \?v?%}x  
   s\+| ql  
class Bar   IR2=dQS  
include Foo   GYZP?E p*  
end   7|5X> yt  
   za%gD  
Bar.new.foo # heyyyyoooo!   TAxu]C$P  
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class   )J*M{Gm6i  
   l~]D|92  
class Baz   eFh7#~m  
extend Foo   7s0\`eXo/  
end   r<$o [,W  
   WNY:HH  
Baz.foo # heyyyyoooo!   |nCVM\+5T  
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||

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