Как получить переменную класса в модуль

Я не могу перезаписать переменную модуля переменной класса.

module Main
  class Traks
    @@endpoint ='/trakings'
    class << self
      include ViewTrait
    end
  end 
end

Мой модуль черт

module Main
  module ViewTrait
    def view(id:, options: "")
      Response::new("#{@@endpoint}/#{id}#{options}").resource(id: id).get
    end
  end
end

в ViewTrait я не могу получить доступ к @@endponint, который я уже определил в своем классе Traks. кто-нибудь может позволить мне, что я пошел не так.

Я могу сказать вам, что если вы замените @@ на одинарный @, это сработает.

max pleaner 14.05.2019 04:32

@maxpleaner- я пытался, но получаю пустую строку в модуле ViewTrait.

Manish J 14.05.2019 04:35

Обратите внимание, что class << self; include ViewTrait; end совпадает с extend ViewTrait. См. Объект#продлить.

Cary Swoveland 14.05.2019 04:40

@CarySwoveland - проблема заключается в доступе к переменной класса в другой метод модуля.

Manish J 14.05.2019 04:57

не @@endpoint в модуле ViewTrait говорит self.@@endpoint и в этом случае не будет ли self модулем ViewTrait? Если вы позвоните правильному получателю, он должен работать?

BenKoshy 14.05.2019 05:25

Да, я знаю. Обычно вызывают include в классе singleton, а не просто используют extend, поэтому я подумал, что вы можете не знать о extend.

Cary Swoveland 14.05.2019 06:43

В вашем вопросе говорилось «переменная экземпляра класса», но @@endpoint (с двумя знаками «at») — это "переменная класса" (я изменил это соответственно). "переменная класса пример" будет @endpoint (один знак "at") в области действия класса. Вы, скорее всего, все равно захотите последнее (или, может быть, константу), потому что переменные класса имеют проблемы с наследованием.

Stefan 14.05.2019 11:40

@Stefan - я исправил. Спасибо, что присоединились к обсуждению. и я понимаю, что вы пытаетесь сказать.

Manish J 14.05.2019 14:06

@ManishJ Я только что проверил это, и вы ответили, что делает работает, но то же самое можно сказать и о замене @@ на @ в исходном коде (используя переменную экземпляра уровня класса, а не переменную класса)

max pleaner 14.05.2019 20:20

Я не уверен точно, почему, но кажется, что переменные класса имеют какое-то странное поведение, когда вам нужно использовать self.class_variable_get в этом случае. Переменные экземпляра уровня класса ведут себя более «нормально», поэтому я советую их, и я думаю, что они работают одинаково для ваших целей.

max pleaner 14.05.2019 20:24
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
10
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в ViewTrait я заменил @@endpoint который self.class_variable_get(:@@endpoint) и я могу получить доступ к классу Variable в модуле. надеюсь, что это поможет другим.

Другие вопросы по теме