假設我想在Ruby中創建一個宏。Ruby可繼承的類宏
class Base
def self.option(name,val)
options[name] = val
end
def self.options
@options ||= {}
end
end
class Foo < Base
option :one, 1
option :two, 2
end
Foo.options #=> {:one => 1, :two => 2}
好的,很簡單。
但是如果我想繼承Foo呢?
class Bar < Foo
end
Bar.options #=> {}
這很糟糕。
所以很明顯,問題是類實例變量是每個類唯一的,即。 @options
裏面的Bar
與@options
裏面的Foo
不一樣。
所以也許一個類變量?我從來沒有能夠找出其中一個有效的用途,讓我們試試看。
# the rest of the code unchanged
class Base
def self.options
@@options ||= {}
end
end
Bar.options #=> {:one => 1, :two => 2}
嘿,工作! ...不是嗎?
class Baz < Foo
option :three, 3
end
Foo.options #=> {:one => 1, :two => 2, :three => 3}
Bar.options #=> {:one => 1, :two => 2, :three => 3}
Baz.options #=> {:one => 1, :two => 2, :three => 3}
X- |
好吧,我一直在搜索這個,我沒有看到任何有用的東西。我嘗試了一些嘗試讀取超類選項(如果已定義)的變體,但無處可查。我想我可能也會問。
你們誰都知道如何做到這一點?還是僅僅是不可能的......
在這裏相當接近,但'.dup'調用意味着你不知道超類在事後做出的任何改變。 – tadman
問題沒有提到關於觀察原始宏的內容。 –
是的,在這種情況下dup是好的。這是一個很好的清潔解決方案。我嘗試了類似的東西,但沒有成功,但老實說,我不知道爲什麼。我猜想必須輸入錯誤的內容。謝謝你在任何情況下爲我整理它:) – Andrew