2010-10-01 2 views
3

Разве они не должны делать то же самое? Почему это происходит? На данный момент я использую module_eval в своем коде по необходимости, но const_set кажется более читаемым. Независимо от того, я действительно хотел бы понять, почему это происходит.Разница между модулем № const_set и модулем # module_eval

вот код:

class A 
    def foo 
    FOO 
    end 
    def self.foo 
    FOO 
    end 
end 
module B 
    class C < A 

    end 
end 
B.const_set(:FOO,'asdf') 
>> B::C.foo 
NameError: uninitialized constant A::FOO 
    from ./foo.rb:6:in `foo' 
    from (irb):1 
>> B.module_eval {FOO='asdf'} 
=> "asdf" 
>> B::C.foo 
=> "asdf" 
+3

Не забудьте признать, что кто-то ответил на ваш вопрос; выберите ответ. – Tom

ответ

2

Ваш module_eval не на самом деле положить константу в модуле. Затем, вы просто доступ к нему из основной:

module B;end 
B.module_eval { FOO = 'asdf' } 
>> FOO 
=> "asdf" 

Вы можете исправить это с self::FOO = 'asdf', то это то же самое, как B.const_set(:FOO,'asdf'). Вы также можете сделать это более непосредственно, как это:

B::FOO = 'asdf' 

Основная проблема с вашим кодом, что вы не можете получить доступ к константы из других модулей, как это. Если они во внешнем модуле, необходимо указать область константы с префиксом :::

def foo 
    B::FOO 
end 
+0

А, спасибо. Что объясняет его. Вернуться к доске для рисования :( – Mike