ruby - 对实例变量范围、顶级与类感到困惑

标签 ruby

我主要在顶层使用 Ruby,我通常编写如下代码:

@x = 'foo'
def show_var
  puts @x
end

show_var # => foo

根据这个例子的工作原理,我认为实例变量对类和对象都可用。

今天遇到这个问题,看来我对实例变量的理解有误:

class Test
  @x = "foo" #you would need to define this inside 'initialize' for this to be available to show_var
  def show_var
    puts @x
  end 
end

Test.new.show_var # => nil

看起来第二个例子是实例变量的工作原理。如果您在类内部定义一个实例变量,那么它只存在于该范围内,而不存在于实例方法中。

那么我的问题是……当变量@x 不应存在于实例方法的范围内时,为什么第一种情况会输出“foo”?此外,在顶级类中定义要用于顶级方法的变量的正确方法是什么?

最佳答案

第一个例子中的方法在顶层。这意味着它属于一个特殊的顶级对象 main。您实际上无法创建更多的 main 副本,因此该方法内部和外部的 self 是相同的。检查一下:

self # => main
def show_var
  self # => main
end

class Test
  self # => Test
  def show_var
    self # => #<Test:0x007fdf9c892d70>
  end 
end

关于ruby - 对实例变量范围、顶级与类感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901882/

相关文章:

ruby-on-rails - 将上传文件的路径存储在数据库中

mysql - 无法通过 Ruby 和 MySQL2 连接到数据库

java - 如何使用 ruby​​ 对 json 中的字符串进行转义?

Ruby 元编程 - 如何处理参数错误

ruby-on-rails - ActiveRecord::Errors 的 Rails 3 替代品是什么?

ruby - 使用 Rspec,为几个选项中的每一个运行测试?

Ruby,Telnet,无超时读取多行响应

ruby - 有没有办法从 UTF-8 编码的文件中删除 BOM?

Ruby 一元代字号 (`~` ) 方法

ruby - ruby 的扩展语法是如何工作的?