Подтвердить что ты не робот

Разница между различными областями переменных в рубине

Ruby имеет 5 переменных областей:

  • Локальные переменные: это обычные переменные, пример x = 25, y = gaurish, где x и y являются локальными переменными.
  • Экземпляры экземпляра: они обозначаются символом @ infront фактического имени переменной. в основном используется с классами, так что каждый экземпляр/объект класса имеет другое/отдельное значение. пример. @employee.name = 'Alex'
  • Переменные класса: обозначаются символами @@ перед именем переменной. class variable, я думаю, что имеет одинаковое значение для всех экземпляров/объектов.
  • Глобальные переменные: они начинаются с символа $ и доступны везде. пример $LOAD_PATH
  • Константы. Должно начинаться с буквы "Столица", но по соглашению, написанному в ALL_CAPS. хотя он постоянный, но его значение его не является постоянным и может быть изменено (хотя Ruby будет предупреждать об этом). поэтому в этом смысле это также действует как переменная.

Как вы можете заметить, все вышеперечисленное представляет собой переменные, которые сохраняют некоторое значение какого-либо типа, и их значение может быть изменено. Но каждая область делает что-то немного другое. Имея 5 разных типов переменных областей, я сбиваю с ума ад. В основном, я затрудняюсь решить, в каком случае, я должен использовать конкретный объем в моем коде. поэтому у меня есть некоторые вопросы в моем сознании. ответьте:

  • Я заметил, что локальные переменные и переменные класса остаются одинаковыми для всех объектов/экземпляров, в отличие от переменных экземпляра. так какая разница между локальными переменными и переменными класса?
  • Можно ли вместо переменных класса использовать локальные переменные? или наоборот. И если да, то почему, а если нет, то почему бы и нет?
  • Глобальные переменные в рубине напоминают мне злые переменные global $x в PHP. Глобальные переменные в рубине также считаются злыми и поэтому не должны использоваться. OR, существуют конкретные случаи, когда имеет смысл использовать глобальные переменные в ruby?
  • Почему константы не являются константами и позволяют изменять их значение? Постоянное значение по определению должно быть постоянным? иначе мы можем просто использовать другую переменную и не изменять ее значение. это будет эквивалентно CONSTANT в рубине?
  • Любая страница/ресурс/ссылка, которая объясняет разницу между 5 различными областями переменных в рубине? Мне нравится держать его под рукой.
  • В этом случае я должен использовать конкретный диапазон переменных в своем коде. поэтому можно было бы объяснить все 5 случаев, например, это было бы здорово, это моя основная причина путаницы.
  • Есть ли де-факто выбор, например public в java? Какой будет безопасная ставка в большинстве случаев использования?

Спасибо, что нашли время, чтобы прочитать и ответить на вопрос

4b9b3361

Ответ 1

  • Переменные класса одинаковы для всех экземпляров, поскольку они являются переменными класса &ndash, связанные с классом. Все доступ к одной и той же переменной, включая каждый экземпляр.

  • Нет. Локальные переменные - это только что. Они могут быть локальными для функции или локальными для объявления класса, которая отличается от переменной класса. Локали в объявлении класса выходят из области действия, когда заканчивается объявление класса.

  • Это потому, что они точно такие же, и они глобальны. Глобальное государство всегда злое; это не свойство языка или среды. Тем не менее, может потребоваться какое-то глобальное состояние – так оно и есть. Имеет смысл использовать глобальное состояние при наличии глобального состояния. Трюк состоит в том, чтобы правильно использовать глобальное состояние, что иногда является нетривиальным делом.

  • Вот как работает Ruby.

  • Один из них уже был предоставлен Крисом.

  • Я бы подумал, что этот вопрос будет в основном самопознанием. Глобальный, когда весь мир нуждается в доступе. Экземпляр, когда он специфичен для экземпляра класса. Локальный, когда это требуется только в локальной области (например, метод, блок (обратите внимание на различия между 1,8 и 1,9 в отношении области блока) и т.д.). Постоянная, когда переменная не должна изменяться. Переменная класса, когда это то, что требуется каждому экземпляру, или если оно открыто через метод класса, что-то тесно связанное с классом.

  • Нет "большинства случаев использования", это полностью зависит от того, что вы делаете с переменной. И public не является де-факто выбором в Java – это зависит от рассматриваемого объекта. Область Java по умолчанию - это пакет-частный (методы, свойства). Что использовать в Ruby полностью зависит от прецедента, отмечая, что, как и в случае с Java, и еще проще в Ruby, можно обойти все.

Ответ 2

Локальные переменные не эквивалентны классам, они привязаны к тому блоку, в котором вы находитесь. Любой локальный, объявленный в блоке, может быть использован там. Переменные класса привязаны к структуре класса, в которой вы находитесь. Определение класса само по себе является блоком, поэтому вы можете получить доступ к локальным переменным аналогично, но вы обнаружите, что если вы ссылаетесь на свой класс в другом контексте, на который вы не можете ссылаться локальная переменная таким же образом.

Глобальные переменные считаются плохими, если их злоупотребляют. ООП должен помочь вам структурировать ваши программы таким образом, чтобы константы всей программы не нужны. Думайте о них как о том, что они являются глобальными: если вы не можете ручаться за его согласованность со всем миром, например, ценность PI или любите ли вы свою жену, вы, вероятно, не должны делать promises.

Как только вы их повесите, я нахожу "Область применения Ruby", чтобы быть хорошей ссылкой.

Ответ 3

Я нашел хорошее и подробное объяснение различных областей и их возможностей в Ruby в следующей ссылке. Области и видимости с примерами в деталях.

В соответствии с этим

Class variable (@@a_variable): Available from the class definition and any sub-classes. Not available from anywhere outside.

Instance variable (@a_variable): Available only within a specific object, across all methods in a class instance. Not available directly from class definitions.

Global variable ($a_variable): Available everywhere within your Ruby script.

Local variable (a_variable): It is available only in the particular method or block in ruby script. 

Еще несколько объяснений относительно переменных экземпляра: вы можете получить доступ к переменным экземпляра в любом методе этого конкретного класса. В то время как локальные переменные недоступны вне метода. Ниже приведен пример из рубинового монаха, который полностью объясняет эту концепцию.

class Item

   def initialize(item_name, quantity)

       @item_name = item_name   
       @quantity = quantity

   end

  def show

   puts @item_name
   puts @quantity
   supplier = "Acme corp"
   puts supplier

  end
end

 Item.new("tv",1).show

Здесь поставщик - это локальная переменная, доступ к которой из метода show может быть получен только в нашем примере. Просто попробуйте объявить переменную поставщика в методе инициализации и распечатать ее в методе show. Он выдаст ошибку в качестве поставщика переменных undefined.

Надеюсь, это поможет.:)

Ответ 4

Вот мои два цента для этого и пишут для программистов С++/java/С#:

A Ruby local/$Глобальная переменная немного похожа на переменную С++/java/С# local/Global.

Переменная Ruby @instance - это как свойство переменной/класса С++/java/С# member, которое может быть доступно в любом методе member/class member. Хотя экземпляр Ruby может применяться не только к классу, но и к Ruby Module.

Переменная класса Ruby @@похожа на статическую переменную типа С++/java, которая является общим для всех экземпляров одного и того же класса.