ruby中不同变量作用域之间的差异

ruby中不同变量作用域之间的差异,ruby,scope,Ruby,Scope,Ruby有5个变量作用域: 局部变量:这些是正常变量,例如x=25,y=gaurish,其中x和y是局部变量 实例变量:这些变量在实际变量名称前面用@符号表示。主要与类一起使用,因此类的每个实例/对象都有不同的/单独的值。例如@employee.name='Alex' 类变量:在变量名称前面用@符号表示。类变量,我认为所有实例/对象的值都相同 全局变量:它们以$符号开头,可以在任何地方访问。示例$LOAD\u路径 常量:必须以大写字母开头,但必须按惯例使用所有大写字母书写。虽然它是一个常量,但它

Ruby有5个变量作用域:

  • 局部变量:这些是正常变量,例如
    x=25
    y=gaurish
    ,其中
    x
    y
    是局部变量
  • 实例变量:这些变量在实际变量名称前面用
    @
    符号表示。主要与类一起使用,因此类的每个实例/对象都有不同的/单独的值。例如
    @employee.name='Alex'
  • 类变量:在变量名称前面用
    @
    符号表示。类变量,我认为所有实例/对象的值都相同
  • 全局变量:它们以
    $
    符号开头,可以在任何地方访问。示例
    $LOAD\u路径
  • 常量:必须以大写字母开头,但必须按惯例使用
    所有大写字母
    书写。虽然它是一个常量,但它的值不是常量,可以更改(不过ruby会抛出一个警告)。所以在这个意义上,这也像一个变量 您可能会注意到,上面所有的变量都存储了某种类型的值,并且它们的值可以更改。但是,每个作用域都有一些不同之处。拥有5种不同类型的变量作用域让我非常困惑。主要是,我很难决定在什么情况下,我应该在代码中使用特定的作用域。所以我脑子里有一些问题。请回答:

  • 我注意到局部变量和类变量对于所有对象/实例都保持不变,这与实例变量不同。那么局部变量和类变量之间有什么区别呢
  • 可以用局部变量代替类变量吗?反之亦然。如果是,为什么?如果不是,为什么不
  • ruby中的全局变量让我想起了PHP中邪恶的
    Global$x
    变量。ruby中的全局变量也被认为是邪恶的,因此不应该使用。或者,在某些特定情况下,在ruby中使用全局变量是有意义的
  • 为什么常量不是常量并允许更改其值?根据定义,常量的值应该是常量,对吗?否则,我们可以只使用另一个变量,而不更改其值。这是否等同于ruby中的常数
  • 有没有解释ruby中5个不同变量作用域之间差异的页面/资源/链接?我喜欢在手边放一本以供参考
  • 在什么用例下,我应该在代码中使用特定的变量范围。所以我们可以用can的例子来解释所有的5种情况,这很酷,这是我困惑的主要原因
  • 在java中是否有像
    public
    这样的事实上的选择?在大多数用例中,哪一个是安全的赌注

  • 感谢您花时间阅读和回答问题

    局部变量并不等同于类变量,它们与您所在的块有关。块中声明的任何局部变量都可以在那里使用。类变量与所处的类结构相关联。定义一个类本身就是一个块,因此您可以类似地访问局部变量,但是您会发现,如果在不同的上下文中引用类,则无法以相同的方式引用局部变量

    全局变量如果被滥用,则被视为不良形式。OOP应该可以帮助您构造程序,这样就不需要整个程序上的常量。把它们想象成是全球性的:如果你不能保证它与整个世界的一致性,比如圆周率的价值,或者你是否爱你的妻子,你可能不应该做出承诺

    一旦你掌握了窍门,我发现“”是一个很好的参考

  • 类变量对于所有实例都是相同的,因为它们是与类关联的类变量。所有内容都访问相同的变量,包括每个实例

  • 不,局部变量只是局部变量。它们可能是函数的局部变量,也可能是类声明的局部变量,这与类变量不同。类声明结束时,类声明中的局部变量将超出范围

  • 这是因为它们完全一样——它们是全球性的。全球国家总是邪恶的;这不是语言或环境的属性。也就是说,可能需要一些全球国家——事实就是这样。当存在全局状态时,使用全局状态是有意义的。诀窍是正确地使用全局状态,这有时是一项非常重要的工作

  • 鲁比就是这样

  • 克里斯已经给了我一个

  • 我认为这个问题基本上是自我回答的。当整个世界都需要访问时,它是全球性的。实例,当它特定于类实例时。仅在局部范围内(例如,方法、块(注意1.8和1.9之间关于块范围的差异)需要局部变量时,当变量不应更改时,保持不变。类变量,当它是每个实例都需要的东西,或者如果通过类方法公开,则是与类紧密关联的东西

  • 没有“大多数用例”,这完全取决于您对变量所做的操作。在Java中,
    public
    并不是事实上的选择——它取决于所讨论的实体。默认Java作用域是包私有的(方法、属性)。在Ruby中使用哪一个完全取决于用例,注意到与Java一样,甚至在Ruby中更容易,事情可以避免


  • 在下面的链接中,我找到了一个关于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. 
    
    关于实例变量的更多解释是:您可以访问该特定类的任何方法中的实例变量。而局部变量不能在方法之外访问。下面是ruby monk的一个例子
    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