2016-12-31 152 views
1

我一直认为实例变量只能在类的定义中使用,并且可以在类内部访问。当我学习铁轨时,我正在看一个像这样的例子:Ruby实例变量和局部变量

class Movie 
    def initialize(isbn) 
    @isbn = isbn 
    end 
    def isbn 
    @isbn 
    end 
end 
@movie = Movie.new("0702") 
@movie.isbn 

我很困惑实例变量出现在类定义之外。为什么使用@movie而不是局部变量“电影”?

后续问题:

  1. 由于实例变量可以住在一个又一个的范围,当程序需要创建多个新的对象,他们都有相同的名称@movie?新对象是否总是覆盖旧对象?

  2. 在较大的程序(如MVC应用程序)中,所有文件(模型,视图,控制器)共享@movie?

+2

你有困惑的原因,因为在这个例子中不需要使用实例变量('@ movie')。一个局部变量(只是'电影')将会非常好。 – spickermann

+0

在您最近的编辑之后,您的问题很不幸,因为过于宽泛而成为焦点话题。请只问一个,每个问题集中的问题。如果您有多个问题,请提出多个明确可理解,重点突出且经过深入研究的问题。请注意,我不知道你的第一个后续问题试图提问。第二个也没什么意义:实例变量属于实例,也就是对象。它们与文件无关。 –

回答

-3

您正在混淆类实例和实例变量。类实例(有时也称为对象)是您的示例中的@movie

换句话说,当您通过创建电影的新实例来创建Class.new(上面的Movie.new)时,初始化/实例化一个类。

在另一方面isbn是一个实例变量(也被称为有时成员变量),因为它是在类和Movie访问中定义的那类的每个实例。它被称为实例变量的原因是类电影的每个实例 - 说你有另一个实例称为@movie2 = Movie.new("1234")也将拥有自己的@isbn副本价值1234

实例变量(在类中定义的变量即一个成员变量),为此类的每个实例化对象具有单独的副本,或实例

0

实例变量具有另一个作用域而不是局部变量。 在类的外部,您仍然处于主对象类中,如以下示例中生成的错误中所示。 所以在我的例子中,如果我不得不在像测试这样的方法中使用电影变量,我需要一个实例变量或(更好)我需要将它作为参数传递。

在这种情况下,它们并不比全局变量更好地处理命名空间。虽然我在过去阅读过这些文章,但找不到有关Ruby的好文章以及使用变量和命名空间。如果我这样做,我会将它添加到答案中。

class Movie 
    def initialize(isbn) 
    @isbn = isbn 
    end 
    def isbn 
    @isbn 
    end 
end 
@movie = Movie.new("0702") 
@movie.isbn 
movie = "you won't see me" 

def test 
    p @movie # #<Movie:0x00000002d1e7f8 @isbn="0702"> 
    p movie # error undefined local variable or method `movie' for main:Object 
end 

test 
2

我一直认为实例变量,因为只有一个类的定义中使用,可以在类的内部访问。

这是错误的。实例变量与类完全无关。实例变量属于对象(又名实例),这就是为什么它们被称为实例变量。

我很困惑实例变量出现在类定义之外。

实例变量出现在类定义之外是完全正确的。毕竟,你的例子中的其他实例变量也不在类定义中,它们在方法定义中。

为什么用@movie代替局部变量“movie”?

在您发布的代码段中没有理由这么做。但如果它是一个更大的计划的一部分,那么肯定有充足的理由这样做。