(В Ruby) смешанное разрешение - в доступе методов класса к константам класса

У меня есть класс с константой, определенной для него. Мне затем определили метод класса что доступы тот постоянный класс. Это хорошо работает. Пример:

#! /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)

Так, какие волшебные приемы делают Вас, товарищи должны позволить методу получить доступ к постоянному классу?Большое спасибо.

12
задан Jon Seigel 16 April 2010 в 20:24
поделиться

3 ответа

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

16
ответ дан 2 December 2019 в 03:54
поделиться

Вероятно, стоит отметить, что вам не нужно включать модули в метакласс.

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 - это лучший способ добавить эти методы в класс.

13
ответ дан 2 December 2019 в 03:54
поделиться

Проблема в том, что если вы просто напишете Const , это будет оцениваться во время создания модуля. Вы должны использовать Module # const_get вместо этого: const_get (: Const) . Это оценивается во время выполнения, когда выполняется метод. Так что это происходит в вашем классе, а не в вашем модуле.

9
ответ дан 2 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: