2015-01-26 51 views
2

我想定義一個塊,在塊中定義了一些常量並且必須複製到新建模塊中。我得到這個至今:將塊常量複製到模塊中

class Foo 
    def self.macros(&block) 
    mod = Module.new do 
     module_eval &block 
    end 
    self.const_set(:Macros, mod) 
    end 

    macros do 
    Point = Struct.new :x, :y 
    VALUE = 5 

    def self.bar 
     "bar" 
    end 

    def foo 
     "foo" 
    end 
    end 
end 

有了上面的代碼,我設法Foo::Macros.bar但常量失蹤。

如何獲得塊內定義的常量?

我想通過嵌入在類內的新模塊來訪問它們,就像Foo::Macros::Point

+0

作爲一個說明,常數通常是'ALL_CAPS'地方類和模塊是'MixedCase'。 – tadman 2015-01-26 18:48:57

+0

剛更新了這個例子。還注意到無法在模塊內部初始化Struct或Classes。似乎在模塊中評估的唯一東西是函數定義 – SystematicFrank 2015-01-26 18:57:40

+0

您可能在使用此方法時遇到問題,因此聲明塊內的常量非常不規則。我傾向於用'const_set'更具體地闡明它,或者找到一種不涉及使用常量的方法,而是聲明方法。 – tadman 2015-01-26 19:12:05

回答

1

紅寶石不斷查找規則不class_evalmodule_eval改變,所以你不能在Foo塊中定義的常量是部分Foo::Macros,遺憾的是。


簡單:

Foo::Value 
Foo::Point 

Foo::Macros只是一個別名爲您定義的匿名模塊,它不會改變對象的範圍之內。

如果你先定義模塊,您可以使用const_get訪問:

module Test 
end 
Test.module_eval do 
    ANSWER = 42 
end 
Test.const_get('ANSWER') 
=> 42 
+0

啊!所以他們在那裏。但實際上,因爲我在Module.new內部進行了評估,所以我期望這些常量在模塊內部,而不是包含在我的類中。那可能嗎?像Foo :: Macros :: Point – SystematicFrank 2015-01-26 18:14:49

+0

嘗試先定義Foo :: Macros,然後module_eval塊內,它應該工作 – Geoffroy 2015-01-26 18:16:35

+0

我試着你的代碼裏面的函數,並得到一個錯誤關於'動態常量賦值'外類函數工程,但我仍然希望DSL將這些常量打包到新模塊中。以下是我到目前爲止所嘗試的內容:https://gist.github.com/fgarcia/0f566ea9313794e19db0 – SystematicFrank 2015-01-26 18:29:05