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


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

简单ruby问题

Ruby代码   6)3eB{$;  
class A   E1C8yIF  
extend self   u!-eP7;7  
def a   As\5Ze9|  
'a'   X3-1)|g !z  
end   kp6x6%{K\  
end   <R(2 9QN  
A.a #=> 'a'   6wd]X-G++  
:I $2[K  
为什么好使呢,代码不是按顺序执行的吗? }M7kApb>Y  
求解答
此帖悬赏中(剩余时间:已结束)...
最佳答案: 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 \(Z'@5vC  
[FLRrTcE  
%lPAq  
Extend亦称扩展,为目标类添加相应的类方法。 {U8Sl.  
或extend会把module的实例方法作为类方法加入类
级别: 北风资深评论员


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

我执行怎么直接报错? y Rr,+>W  
Ms ;:+JI  
Ruby代码   $vnshU8/v  
TypeError: wrong argument type Class (expected Module)   8_US.52V  
    from (irb):22:in `extend'   8  ;y N  
    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是为目标类添加类方法。 #'_# t/u  
还有一点,Module是Class的超类,就是说Class is a Module。但是Class具有更多的特性,比如实例化。这点是理解继承的基础之一。 *#T: _  
A@}5'LzL  
Ruby代码   WNGX`V,d  
module A   vB8$Qx\J  
extend self   d`^3fr'.4A  
def a   I2[Z0G@&=  
'a'   r mX*s} B  
end   _J1\c~ke"  
end   g0B] ;Y>(  
A.a #=> 'a'   # e? B  
ET}Z>vU} +  
module A本身是有一个这样的方法的a。A如果扩展了他本身,就是将A的a方法加入到他的类方法列表里。 9O;Sn+  
一个简单的例子,从网上找的。 n _K1%  
Ruby代码   Fv^zSoi2  
module Foo   dn 6]qW5  
def foo   :^)?AO#J  
puts 'heyyyyoooo!'   mw"FQ?bJ  
end   +``vnC  
end   l U/Xi  
   :nIMZRJ_!E  
class Bar   n41#  
include Foo   ;Nn(  
end   s5*4<VxQN.  
   T?1BcY  
Bar.new.foo # heyyyyoooo!   _lv{8vf1B  
Bar.foo # NoMethodError: undefined method ‘foo’ for Bar:Class   KrGl}|  
   nah?V" ?Y  
class Baz   x1 |/  
extend Foo   ljbAfd  
end   Ze0qRLuH!  
   -Lq+FTezE  
Baz.foo # heyyyyoooo!   9nAP%MA`  
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||

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