2013-10-09 142 views
0

在codeschool的課程中,左上角塊中的代碼被證明是不正確的。爲什麼在這裏需要'self'而不是實例變量?

「當然是這樣」,我對自己說。我知道它應該是@name = name。什麼是新問題?爲什麼在這裏需要「自我」呢?請看下文中我的工作代碼:

enter image description here

class UserList 
    attr_accessor :name 
    def initialize(name) 
     @name = name 
    end 
end 

list = UserList.new('celebrities') 
list.name 
+0

目前正在閱讀http://stackoverflow.com/questions/1693243/instance-variable-self-vs?rq=1 – dwilbank

+0

只是對下面的答案進行一點說明,這裏的方法'name =()',它是由'attr_accessor'產生的,必須有一個接收方,該方法被應用。 'self.name ='指定接收者爲'self',這裏等於類UserList的一個實例。如果你沒有指定接收者(只是'name ='),Ruby假定接收者是'self',所以這裏是可選的。請注意,在其他情況下,使用'self'不是可選的。 –

回答

1

self是沒有必要在這裏。你在做什麼是等同的。無論哪種方式都很好。

+2

在這個特定情況下,它是等價的,但這僅僅是因爲'name ='方法是由'attr_accessor'定義的,如果你有'name ='方法實際上做了一些有趣的事情,那麼'@name ='name''和'self.name ='name''不等於。 –

+0

@ muistooshort好點 – ThomasW

+0

啊......所以codechool應該告訴我特殊情況......也許是在即將到來的課程 – dwilbank

0

self.name =調用設置實例變量@namename=方法。你在做什麼是等同的。

0

Codeschool在此處介紹attr_accessor。並且你是對的

@name  = name 
self.name = name 

是等同的。

但是一方面爲什麼選擇attr_accessor(而不是attr_reader)然後寫@name=?學習的一部分是attr_accessor創建了一個setter方法。使用attr_accessor@name=是沒用的。

而在另一方面,他們想指出的另一個重要的細節:即使attr_accessor創建一個方法def name=(name),非此將工作:

name = name 
name = 'Bart' 

因爲它永遠不會改變底層@name變量也不甚至可以觸摸使用attr_accessor創建的方法。它會改變本地變量name

這是一個重要的學習。知道name=self.name=之間的區別。

相關問題