2012-12-13 29 views
2

如何紅寶石呼叫varz方法通過使用varz[:foo]通過變量和紅寶石的方法困惑

class Component 
    class << self 
    def varz 
     @varz ||= Hash.new 
    end 
    end 
end 

Component.varz[:foo] = 'bar' 
puts Component.varz # {:foo=>"bar"} 
+1

你在哪裏得到你的知識呢?我建議一本好書。它會清除許多混淆 –

回答

1

您以錯誤的方式切入。 Component.varz是一個方法調用。對它的結果(這是一個散列),[:foo] =適用。 [][]=方法是特別的,因爲您不會在接收方和方法之間放置一段時間。

+1

「它(這是一個散列)」 - 這是一個方法調用或散列? :)索引器適用於所述方法調用的* result *,而不是調用它自己。 –

+0

@SergioTulentsev對。那會更好。我編輯它。 – sawa

+0

我認爲這是一個更好的答案。因爲我知道ruby如何將對象作爲對象,以及它如何返回值,但我只是混淆瞭如何使用上面已經解釋的[]的varz方法。 – harryz

3

class < < self用於定義將在類上調用的類方法。

其中作爲@varz表示實例變量。你可能會想,那麼爲什麼這個實例對象在類方法中做了什麼?這是因爲類本身是的實例。

還有一兩件事要注意,在紅寶石方法返回它的最後一句話。所以在你的情況下,Component.varz返回哈希類型的實例變量@varz。

Component.varz[:foo] = 'bar' 

這增加了key-value對foo和'bar'來散列。

最後,

p Component.varz 

要打印由varz方法returened值。

+0

您的回答非常好,但我認爲下面的答案更好。因爲我知道ruby如何將對象作爲對象以及它如何返回值,但我很困惑它如何在[]中使用varz方法。 – harryz

+0

您沒有直接使用varz方法,您正在使用由varz方法返回的對象。 –

+0

是的,我現在明白了。非常感謝。 – harryz