正常变量与Ruby中的实例变量有什么不同?
考虑以下示例ruby类
class User def hello puts "hello" end end
现在,用于初始化。 有两种方法
正常变量
1.9.3p125 > tr = User.new => # 1.9.3p125 > tr.hello Hello world => nil`
实例变量:
1.9.3p125 > @tr = User.new => # 1.9.3p125 > @tr.hello Hello world => nil
现在,在这两种情况下它都是一样的。 那么正常变量和实例变量有什么区别?
普通变量仅在当前上下文中具有范围; 实例变量在类的一个实例中具有范围。 在你的情况下,他们感到困惑,因为上下文是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 => # 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 #
普通变量称为局部变量,并且是定义它的代码构造的本地变量 (如果在方法中定义它,则无法在该方法之外访问它)。
实例变量是对象的特定实例的本地变量 。 如果一个对象更改了实例变量的值,则仅对该对象进行更改。
类的所有实例都有本地类变量 :
@@class_variable = 'a class variable'
并且可以从程序中的任何位置访问全局变量 :
$global_variable = 'a global variable'
局部变量只能在定义它的方法中使用(或者,当变量在顶层定义时,仅在任何方法之外)。 可以在同一实例上调用的任何方法中使用实例变量。
这是一个可以看出差异的例子:
@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
- 要求Nokogiri? 没有这样的文件加载
- 如何通过“http://gems.rubyforge.org/似乎不是存储库”错误消息
- 何时使用关键字参数也称为Ruby中的命名参数
- jekyll-github-metadata中的SSL证书validation失败
- 关于将实例变量传递给redirect_to方法的困惑。 正如Rails指南中所见
- 循环通过状态 – 范围? 的Ruby / Rails
- hubris无法安装:缺少C库:ruby,ruby,ruby
- 无法使用Ruby和net / ssh连接密钥
- 使用自定义URL(例如http:// localhost:3000 / education_informations / new?user_id = 10)在新页面上呈现错误