ruby筆記 基於對象的類(object specific class)

來源:互聯網
上載者:User

此筆記是為了協助理解 "<<" 指令
ruby語言允許我們在一個對象的基礎上定義類,使得我們可以單獨擴充一個對象的行為,例子如下

test="hello" #普通string 
normal=a.dup #還是普通string 
class << test 
        def to_s 
                "value is #{self}" 
        end 
end        #test對象已經被更新, normal保持不變 

運行完上述代碼以後

normal.to_s =="hello" 
test.to_s=="value is hello" 

從這個例子上來看, 此時的test對象的類已經被擴充為新的to_s方法,但是這個擴充只能影響到test對象自己 ,其他的string對象還是原來的方法.

我的理解: 基於對象的類通過指令"<<" 來定義, 他能夠擴充並且只能擴充被定義的對象, 同時不能影響系統中其他同類型的對象
"<<"指令可以用來臨時修改一個對象,此外,這個指令還可以用來定義類的方法, 一般定義類方法是通過如下文法

class Test 
        def Test.say 
                "hello" 
        end 
end

如果嫌需要寫多次類名麻煩,可以通過self替換

class Test 
        def self.say 
                "hello" 
        end 
end

有了"<<"指令,還可以這樣來

class Test 
        class << self 
                def say 
                        "hello" 
                end 
        end 
end

上述三者的定義是等價的,而且在ruby原始碼中很容易看到第三種用法
 
解釋: 在ruby中,每一個類都有一個唯一執行個體的metaclass. 類定義的方法都存在這個metaclass中
通過"<<"對這個唯一執行個體的metaclass作擴充,給metaclass增加方法和直接給這個類增加方法是一樣的效果

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.