2016-12-31 150 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」?

在您發佈的代碼段中沒有理由這麼做。但如果它是一個更大的計劃的一部分,那麼肯定有充足的理由這樣做。