2012-07-15 58 views
21

Ruby有5个可变范围:差异红宝石作用域

  1. 本地变量:这些是正常的变量,例如x = 25y = gaurish其中xy是局部变量。
  2. 实例变量:这些用实际变量名称的@符号表示。主要与类一起使用,以便类的每个实例/对象具有不同的/单独的值。例。 @employee.name = 'Alex'
  3. 类别变量:用变量名前面的@@符号表示。类变量,我认为具有相同的价值accos所有实例/对象。
  4. 全局变量:他们开始与$符号和可访问到处。示例$LOAD_PATH
  5. 常量:必须以大写字母开始,但以大写字母ALL_CAPS写。虽然,它是一个常量,但它的价值不是恒定的,可以改变(虽然红宝石会发出警告)。所以从某种意义上讲,这也是一个变量。

正如你可能会注意到的,以上所有的变量都存储某种类型的值,并且它们的值可以被改变。但是,每个范围都有一点不同。有5种不同类型的可变范围会让我感到困惑。主要是,我很难决定在什么情况下,我应该在我的代码中使用特定范围。所以我在脑海里有一些问题。请回答:

  1. 我注意到局部变量和类变量对所有对象/实例保持不变,与实例变量不同。那么局部变量和类变量有什么区别?
  2. 局部变量可以用来代替类变量吗?或相反亦然。如果是,那么为什么,如果不是,那为什么不呢?
  3. Ruby中的全局变量让我想起了PHP中的邪恶global $x变量。 Ruby中的全局变量也被认为是邪恶的,因此不应该被使用。或者,在某些情况下,在ruby中使用全局变量是有意义的?
  4. 为什么常量不是常量并且允许改变它们的值?定义中的常数值应该是正确的?否则,我们可以使用另一个变量并且不要更改它的值。这会相当于红宝石中的CONSTANT吗?
  5. 解释ruby中5个不同变量作用域之间区别的任何页面/资源/链接?我喜欢保留一个方便参考。
  6. 在什么用例下,我应该在我的代码中使用特定的变量作用域。所以可以解释所有5例可能会很酷的例子,这是我混淆的主要原因。
  7. 在java中是否有像public这样的事实选择?在大多数使用情况下,哪个安全下注?

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

+0

对于第一点,所有对象共享类级变量,每个单独的对象将有自己的局部变量副本 – 2012-07-15 20:01:12

+0

如果每个单独的对象都有自己的局部变量副本,那么不是局部变量更像是实例变量然后? – CuriousMind 2012-07-15 20:02:53

+1

排序,我想你可以这样看他们。实例变量_属于一个对象的实例,通常构成该对象的属性。例如'Person'对象可能有两个实例变量'@ first_name'和'@ last_name',它也可能有一个局部变量'x',但'x'与'Person'对象的状态无关 – 2012-07-15 20:06:32

回答

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

  2. 不。局部变量只是–本地。它们可能是本地的一个功能,或者是本地的类别声明,这是不同比作为类变量。当类声明结束时,类声明中的局部变量超出范围。

  3. 这是因为他们是完全一样的–他们是全球性的。全局状态是总是邪恶;这不是语言或环境的属性。也就是说,一些全局状态可能需要–这就是它的方式。有全局状态时使用全局状态是有意义的。诀窍是使用全局状态正确,这有时是一个不平凡的努力。

  4. 这就是Ruby是如何。

  5. Chris已经给出了一个。

  6. 我会认为这个问题很大程度上会自我回答。全球当全世界需要访问时。实例,当它是特定于类实例时。只在本地范围内需要本地(例如,方法,块(注意区块范围在1.8和1.9之间的区别)等)。当变量不应该改变时为常量。一个类变量,当它是每个实例需要的东西时,或者如果通过类方法暴露,则是与类紧密关联的东西。

  7. 没有“最多用例”,它完全取决于你对变量做什么。并且public不是Java –中的事实选择,它取决于所讨论的实体。默认的Java范围是包私有的(方法,属性)。在Ruby中使用哪一个完全取决于用例,注意到与Java一样,在Ruby中更容易,事情可以绕开。

5

局部变量是不等同于阶级的人,他们是绑你是在块,任何地方在一个块中声明可以在那里使用。类变量与你所处的类结构有关。定义一个类本身就是一个块,所以你可能能够类似地访问局部变量,但是你会发现如果你在不同的上下文中引用你的类,你不能引用局部变量以相同的方式。

如果滥用,全局变量被认为是不好的形式。 OOP应该帮助你构建你的程序,使整个程序的常量不再需要。认为它们实际上是全球化的:如果你不能保证它与整个世界的一致性,比如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. 

关于实例变量一些更多的解释是:您可以在特定类的任何方法访问实例变量。虽然局部变量不能在方法外访问。下面是一个从ruby和尚中彻底解释这个概念的例子。

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#程序员:

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

Ruby @instance变量它就像C++/java/c#的成员变量/类属性,可以在任何成员函数/类方法中访问。尽管Ruby实例不仅可以应用于类,还可以应用于Ruby模块。

Ruby @@ class变量就像C++/java的静态成员变量,它在同一个类的所有实例之间共享。