У меня есть класс с константой, определенной для него. Мне затем определили метод класса что доступы тот постоянный класс. Это хорошо работает. Пример:
#! /usr/bin/env ruby
class NonInstantiableClass
Const = "hello, world!"
class << self
def shout_my_constant
puts Const.upcase
end
end
end
NonInstantiableClass.shout_my_constant
Моя проблема возникает в попытке выгнать этот метод класса с квартиры для внешнего модуля, как так:
#! /usr/bin/env ruby
module CommonMethods
def shout_my_constant
puts Const.upcase
end
end
class NonInstantiableClass
Const = "hello, world!"
class << self
include CommonMethods
end
end
NonInstantiableClass.shout_my_constant
Ruby интерпретирует метод как запрос константы от модуля, а не класса:
line 5:in `shout_my_constant': uninitialized constant CommonMethods::Const (NameError)
Так, какие волшебные приемы делают Вас, товарищи должны позволить методу получить доступ к постоянному классу?Большое спасибо.
This seems to work:
#! /usr/bin/env ruby
module CommonMethods
def shout_my_constant
puts self::Const.upcase
end
end
class NonInstantiableClass
Const = "hello, world!"
class << self
include CommonMethods
end
end
NonInstantiableClass.shout_my_constant
HTH
Вероятно, стоит отметить, что вам не нужно включать модули в метакласс.
class NonInstantiableClass
Const = "hello, world!"
class << self
include CommonMethods
end
end
Ruby имеет ключевое слово extend
, которое эффективно добавляет интерфейс модулей к классу. , например,
class NonInstantiableClass
Const = "hello, world!"
extend CommonMethods
end
Вам все равно нужно убедиться, что вы ссылаетесь на правильную константу, используя self :: Const
или const_get
, но extend
- это лучший способ добавить эти методы в класс.
Проблема в том, что если вы просто напишете Const
, это будет оцениваться во время создания модуля. Вы должны использовать Module # const_get
вместо этого: const_get (: Const)
. Это оценивается во время выполнения, когда выполняется метод. Так что это происходит в вашем классе, а не в вашем модуле.