2011-08-06 41 views
2

说实话,我仍然对实例变量和局部变量感到困惑,不确定应该使用哪一个。究竟是什么地方范围?

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

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_var作品而MyClass.new_show_local_var

有关2种变量的另一件事是,块似乎共享相同的局部范围,所以本地变量可以参考:

local_var = 1 

3.times do 
    puts local_var 
end 

我所知道的关于t他的区别,有没有其他可用的?请让我知道

,如果有这方面有任何的文章,这将是对我来说很有帮助,

+0

我不知道红宝石,但你似乎有想法。一个街区就像工厂里的一个房间。如果你在一个椅子工厂里,那里有一个“精加工”的房间 - 椅子没有涂漆并且涂漆出来。如果另一个*房间里的工作人员说“把画笔交给我”,答案是“什么?你指的是来自”整理“房间的画笔?这不是我们的,它可能是现在被扔掉了。” – Beta

+0

@Beta:与块/封闭的关系更像是:有人在将画笔放入椅子*之前*进入最后房间。然后在整理房间里,工作人员要求画笔,然后告诉他:“是的,我们在这里没有自己的画笔,但是看,有人从外面给我们提供一个。”?无论如何,这是我曾经听到过描述这种现象的最古怪的比喻,但我喜欢它:) – emboss

回答

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 

一旦你超出范围(fooend传递)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

虽然我们在它上面,但也有类变量(定义为@@class_var),可从任何类的实例访问。

我没有特别为您提供的文章,但是一些关于ruby variable scope的搜索以及关于每种类型的变量都应该为您提供所有您需要的信息!

+0

感谢你的榜样,它开始对我有意义,我应该做更多的想法弄清楚它 – mko

1

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

Article on ruby variable scope

Article on scope in general

2

您描述的第二个示例称为Closure。保罗把它很好地有:

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

  • 它可以传递由人谁对需求执行的价值和
  • 该值在此时可以引用来自创建它的上下文的变量(即,它关于变量访问是关闭的,在数字意义上是“闭合”)。

有关Ruby的可用范围,你可以参考Ruby Programming wikibook一个不错的,简单介绍。

  • 本地范围
  • 全局范围
  • 实例作用域
  • 类范围

“默认范围”,因为它有时被称为执行代码时没有范围修饰符围绕它,如

@iv = "Who do I belong to?" 

是“主”对象的范围。