【问题标题】:Normal Variables Vs Instance variable in Ruby, Whats the difference?Ruby中的普通变量与实例变量,有什么区别?
【发布时间】:2012-04-23 12:43:35
【问题描述】:

考虑以下示例 ruby​​ 类

class User
  def hello
    puts "hello"
  end
end

现在,进行初始化。有两种方法

正常变量

1.9.3p125  > tr = User.new
 => #<User:0x98778c4>
1.9.3p125  > tr.hello
 Hello world
 => nil`

实例变量:

1.9.3p125 > @tr = User.new
 => #<User:0x9890f2c>
1.9.3p125 > @tr.hello
Hello world
 => nil

现在,在这两种情况下,它的工作原理都是一样的。那么普通变量和实例变量有什么区别呢?

【问题讨论】:

    标签: ruby variables


    【解决方案1】:

    普通变量仅在当前上下文中具有作用域;一个实例变量的作用域贯穿于一个类的一个实例中。在您的情况下,他们感到困惑,因为上下文是main,它充当Object 的实例。

    考虑以下内容,这可能会使事情更清楚

    class User
      def set_name
        @name = "Bob"
        surname = "Cratchett"
      end
    
      def hi
        puts "Hello, " + @name
      end
    
      def hello
        puts "Hello, Mr " + surname
      end
    end
    
    irb(main):022:0> u = User.new
    => #<User:0x29cbfb0>
    irb(main):023:0> u.set_name
    irb(main):024:0> u.hi
    Hello, Bob
    => nil
    irb(main):025:0> u.hello
    NameError: undefined local variable or method `surname' for #<User:0x29cbfb0 @name="Bob">
    

    【讨论】:

      【解决方案2】:

      普通变量称为局部变量,对于定义它的代码结构是局部的(如果您在方法中定义它,则无法在该方法之外访问)。

      实例变量是对象的特定实例的局部变量。如果一个对象改变了实例变量的值,那么改变只会发生在那个对象身上。

      还有类变量对于类的所有实例都是局部的:

      @@class_variable = 'a class variable'

      并且全局变量可从程序中的任何位置访问:

      $global_variable = 'a global variable'

      【讨论】:

        【解决方案3】:

        局部变量只能在定义它的方法中使用(或者,当变量在顶层定义时,只能在任何方法之外)。实例变量可以在同一实例上调用的任何方法中使用。

        这是一个您可以看到差异的示例:

        @tr = User.new
        
        def foo
          @tr.hello
        end
        
        foo
        # Hello World
        
        
        tr = User.new
        
        def bar
          tr.hello
        end
        
        bar
        # Exception because tr is not accessible from within bar
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-07
          • 2012-12-17
          • 2014-09-21
          相关资源
          最近更新 更多