什么是本地范围?

时间:2011-08-06 12:32:08

标签: ruby scope

老实说,我仍然对实例变量和局部变量感到困惑,不确定应该使用哪个。

我所知道的只有一个不能使用的局部变量的条件是:

class MyClass
  def initialize
    local_var = 1
    @instance_var = 1
  end

  def show_local_var
   local_var
  end

  def show_instance_var
   @instance_var
  end
end

显然,MyClass.new.show_instance_varMyClass.new_show_local_var而非

时有效

关于这两种变量的另一个问题是块似乎共享相同的局部范围,因此可以引用局部变量:

local_var = 1

3.times do
  puts local_var
end

我所知道的区别是什么,还有其他可用吗?请让我知道

如果有任何关于此的文章,这对我有用,

3 个答案:

答案 0 :(得分:2)

本地变量“就在这里”,无法从其他任何地方访问。

class MyClass
  def foo
    local_var = 2
    #I use this to do some sort of calculation
    @instance_var = local_var + 34
    local_var = 5 * @instance_var
    puts local_var
  end
  # From here, local_var is unaccessible.
end

一旦你超出范围(foo end已通过)local_var已不复存在,无法被引用。

实例变量始终可供整个班级使用。

class MyClass
  def initialize
    @instance_var = 0
  end

  def foo
    local_var = 2
    #I use this to do some sort of calculation
    @instance_var = local_var + 34
  end

  def some_operation
    if @instance_var == 36
      @instance_var = 3
    else
      @instance_var = 1
    end
  end
end

因此,当您致电m = MyClass.new以及稍后m.some_operation时,它正在使用相同的@instance_var

虽然我们在这里,但也有类变量(定义{{​​1}}),可以从类的任何实例访问。

我没有特别为您提供的文章,但有些关于@@class_var的Google搜索以及每种类型的变量应该为您提供所需的所有信息!

答案 1 :(得分:2)

您描述的第二个示例称为Closure。保罗非常好地说:

  

闭包是一个符合三个标准的代码块:

     
      
  • 它可以作为值和
  • 传递   
  • 具有该值的任何人按需执行
  •   
  • 它可以从创建它的上下文中引用变量(即,在“闭合”一词的数学意义上,它关于变量访问是关闭的。)
  •   

有关Ruby中可用范围的简短快速介绍,您可以参考Ruby Programming wikibook

  • 本地范围
  • 全球范围
  • 实例范围
  • 班级范围

“默认范围”,因为在执行没有范围修饰符的代码时有时会引用它,如

@iv = "Who do I belong to?"

是“主要”对象的范围。

答案 2 :(得分:1)

本地范围仅限于声明变量的位置,即函数或for循环,但不能从该位置外部访问。但是,如果在函数,for循环等中嵌套其他构造,则内部构造可以访问局部变量。实例变量的范围限定为类的实例。

Article on ruby variable scope

Article on scope in general