Какая разница в области видимости между глобальной переменной и константой в Ruby? - PullRequest
1 голос
/ 28 апреля 2020

В языке программирования Ruby существует понятие глобальной переменной, начинающейся со знака доллара, например, $foo, и константы, начинающейся с заглавной буквы, например, Foo. Какова точная разница в области действия каждого из этих двух видов имен в Ruby, и в каком конкретном случае глобальная переменная должна быть предпочтительнее постоянной, или наоборот?

1 Ответ

1 голос
/ 28 апреля 2020

Глобальные переменные - это те, к которым можно получить доступ откуда угодно. Их область действия становится целым объектом main. Это означает, что они могут использоваться где угодно в этой области, то есть где угодно в самом коде. Например,

module A
  module B
    class C
      $glo = 'this is glo-bal variable'
    end
  end
end

module D
  class E
    CON = 'this is con-stant'
    def call_glo
      puts $glo
    end

    def call_con
      puts CON
    end
  end

  def self.call_con
    puts CON
  end

  E.new.call_glo                 #=> "this is glo-bal variable"
end

D::E.new.call_glo                #=> "this is glo-bal variable"
D::E.new.call_con                #=> "this is con-stant"
D.call_con                       #=> Throws Error Unitialized Constant

Хотя константы ограничены областью, в которой они определены. Они могут использоваться только в той области, в которой они определены.

Теперь, как вы сказали, константы начинаются с прописные, следовательно, все имена классов и модулей сами по себе не что иное, как константы.

Теперь в приведенном выше примере вы видите, что метод call_glo вызывается дважды. Однажды из области действия module D, в то время как одна из области действия объекта main, видите ли вы разницу между экземплярами class E?

В module D она вызывается без оператора области действия :: в то время как за пределами модуля мы должны были использовать оператор области видимости, то есть ограничение области видимости. Константы связаны с.

...