2012-07-15 4 views
21

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

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

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

  1. Я заметил, что локальные переменные и переменные класса остаются неизменными для всех объектов/экземпляров, в отличие от переменных экземпляра. так какая разница между локальными переменными и переменными класса?
  2. Могут ли вместо переменных класса использоваться локальные переменные? или наоборот. И если да, то почему, а если нет, то почему бы и нет?
  3. Глобальные переменные в рубине напоминают мне злые переменные global $x в PHP. Глобальные переменные в рубине также считаются злыми и поэтому не должны использоваться. ИЛИ, существуют конкретные случаи, когда имеет смысл использовать глобальные переменные в рубине?
  4. Почему константы не являются константами и позволяют изменить их значение? Значение константы по определению должно быть постоянным? иначе мы можем просто использовать другую переменную и не изменять ее значение. это будет эквивалентно ПОСТОЯННЫМ в рубине?
  5. Любая страница/ресурс/ссылка, которая объясняет разницу между 5 различными областями переменных в рубине? Мне нравится держать его под рукой.
  6. В этом случае я должен использовать конкретный диапазон переменных в своем коде. поэтому можно было бы объяснить все 5 случаев, например, это было бы здорово, это моя основная причина путаницы.
  7. есть де-факто выбор, как public в java? Какой будет безопасная ставка в больше всего прецедентов?

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

+0

Для первого пункта все объекты разделяют переменные уровня класса, каждый отдельный объект будет иметь свою собственную копию локальной переменной –

+0

Если каждый отдельный объект будет иметь свою собственную копию локальной переменной, не являются локальными переменными, более похожими на переменные экземпляра тогда? – CuriousMind

+1

Вид, я полагаю, вы могли видеть их таким образом. Переменные экземпляра _belong_ к экземпляру объекта и обычно составляют свойства этого объекта. Например, объект 'Person' может иметь две переменные экземпляра' @ first_name' и '@ last_name', он также может иметь локальную переменную' x', но 'x' не имеет отношения к состоянию объекта' Person' –

ответ

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

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

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

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

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

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

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

5

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

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

Как только вы их повесьте, я нахожу «Ruby Variable Scope», чтобы быть хорошей ссылкой.

2

Я нашел хорошее и подробное объяснение относительно разных областей и их видимости в Ruby в следующей ссылке. Scopes and Visibilities with Examples in detail.

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

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 

Здесь поставщик является локальной переменной, которую можно получить из шоу метода только в нашей example.Just пытаются объявить переменную поставщика в методе инициализации и напечатать его в шоу-метода. Это даст ошибку в качестве неопределенного поставщика переменных.

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

1

Вот мои два цента за это и пишет для C++/Java/C# программисты:

рубинового локальная/переменная $ Global немного как C++/Java/местные/Глобальная переменная С #.

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

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

Смежные вопросы