各种变量之间的差异作用域的红宝石(Difference between various variab

2019-06-17 10:35发布

Ruby有5米变量的范围:

  1. 本地变量 :这些是正常的变量,例如x = 25y = gaurish其中xy是局部变量。
  2. 实例变量 :这些被标以@符号盈的实际变量名。 主要用与类,使得类的每个实例/对象具有不同的/单独的值。 例。 @employee.name = 'Alex'
  3. 类变量 :与表示@@在变量名前的符号。 类变量,我认为有accos所有实例/对象相同的值。
  4. 全局变量 :他们开始与$符号,并访问无处不在 。 例如$LOAD_PATH
  5. 常量 :必须以大写字母,但以书面形式在会议开始ALL_CAPS 。 虽然,这是一个常数,但其价值的不恒定,可以改变(红宝石将抛出一个警告,虽然)。 所以在这个意义上,这也就像一个变量。

正如你可能会注意到,以上所有的是存储某种类型的一些价值,其价值是可以改变的变量。 但是,每个范围做一些事情有点不同。 有5种不同类型的变量的作用域是混淆了我的地狱。 主要是,我有困难在什么样的情况下决定,我应该在我的代码使用一个特定的范围。 所以我在我的脑海一些问题。 请回答:

  1. 我注意到,局部变量和类变量的所有对象/实例留相同,不同的实例变量。 所以局部变量和类变量之间有什么区别?
  2. 可以局部变量代替类变量的使用? 或相反亦然。 如果是,那么为什么,如果没有,那么为什么不呢?
  3. 在红宝石全局变量让我想起了邪恶的global $x在PHP变量。 是全局变量的红宝石也被认为是邪恶的,因此不应使用。 或者,有些情况下是有意义的红宝石使用全局变量具体案件?
  4. 为什么常量不是常数,允许改变了他们的价值? 由定义常量的值应该是恒定的吧? 否则,我们只能用另一个变量,但不改变它的值。 那会是相当于红宝石恒定?
  5. 任何网页/资源/链接,解释了红宝石5级不同的变量的作用域有什么区别? 我想保持一个方便的参考。
  6. 在什么样的用例,我应该在我的代码使用特定的变量范围。 这样一个可以解释所有5例即可例子会很酷,这是我对混乱的主要原因。
  7. 有没有像实际的选择public在Java? 这将是在大多数使用情况的安全的赌注?

感谢您抽出时间来阅读和回答问题

Answer 1:

  1. 类变量是所有实例是相同的,因为他们是类类变量相关。 一切都访问相同的变量,包括每个实例。

  2. 第局部变量只是局部。 它们可以是本地的的函数,或者本地的类声明 ,这比作为一个类变量不同 。 在类声明当地人走出去的范围时,类声明结束。

  3. 这是因为他们是完全一样的 - 它们全球性的。 全局状态永远是邪恶的; 这不是语言或环境的属性。 这就是说, 一些全球性状态可能需要-这只是事情是这样的。 这是有道理的使用全局状态时,有全局状态。 关键是要正确使用全局状态,这有时是一个不平凡的努力。

  4. 这是红宝石只是如何。

  5. 一个已经被克里斯给出。

  6. 认为这个问题将在很大程度上自我回答。 当整个世界需要进入全球。 当它的实例具体到一个类的实例。 当地当它在本地范围内只要求(例如,一个方法,一个块(1.8和1.9之间的差异注意到关于封锁范围)等),恒时不应该要改变的变量。 一个类变量时,它的东西,无论是每个实例的需求,或者通过一个类的方法暴露,东西紧紧地关联到一个类。

  7. 没有“最用例”,这完全取决于你用变量做什么。 而public是不是在事实上选择Java的这取决于所涉及的实体。 默认Java范围是包专用(方法,属性)。 这在Ruby中使用完全依赖于用例依赖,并指出,如与Java,甚至更容易在Ruby中,事情是可以规避。



Answer 2:

局部变量是不等同于阶级的人,他们是绑你是在该块。在一个块中的任何地方宣称可以在那里使用。 类变量是绑类结构你在。定义一个类本身就是一个块,所以你可能能够同样访问本地变量,但如果你是指你的类在不同的环境下,你不能引用,你会发现以同样的方式局部变量。

全局变量被认为是不好的形式,如果被滥用。 OOP应该有助于你的程序,从而不需要对整个程序常量。 把它们当作实际上是全球性:如果你不能为它的一致性担保到整个世界,像PI的值或者你是否不爱你的妻子,你可能不应该作出承诺。

一旦你得到他们的窍门,我觉得“ 红宝石变量的作用域 ”是一个很好的参考。



Answer 3:

我发现关于不同的范围和他们在红宝石下面的链接能见度良好和深入的解释。 范围和典型能见度与详细实施例。

根据它,

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访问试图声明中初始化方法的供应商变量,它打印出来的显示方法的局部变量。 它会给一个错误未定义的变量供应商。

我希望它能帮助。 :)



Answer 4:

这里是我的这个两分钱,并编写C ++ / JAVA / C#程序员:

Ruby的本地/ $全局变量有点像C ++ / JAVA / C#的局部/全局变量。

一个Ruby @instance可变它像C ++ / JAVA / C#的成员变量/类属性,其可以是任何成员函数访问/类method.Though红宝石实例不但可以以类,而且到Ruby模块被应用。

一个Ruby @@类变量是等作为C ++ / Java的静态成员变量这是相同的类的所有实例之间共享。



文章来源: Difference between various variables scopes in ruby
标签: ruby scope