2014-01-31 83 views
1

我剛剛在上個月瞭解了Ruby,並且正在使用RSpec處理我的TDD技能。Ruby 2.1.0在默認值後重新分配實例變量

我試圖得到以下測試通過:

it "has a modified color" do 
    @phone.color = "green" 

    puts @phone.color.should == "green" 
end 

這裏是我的代碼:

class Phone 

     attr_reader :name 
     attr_reader :manufacturer 
     attr_accessor :color 

     def initialize(name, manufacturer) 
     @name   = name 
     @manufacturer = manufacturer 
     end 

     def color(color='black') 
     @color = color 
     end 
    end 

我試圖做的主要是:

phone = Phone.new("Moto X", "Motorola") 
    puts phone.color # 'black' 
    phone.color = "green" 
    puts phone.color # 'green' 

但是,嘗試將顏色重新分配爲綠色後,它仍然輸出「黑色」,請幫助。

謝謝。

+0

它仍然得到同樣的結果很遺憾。 – Pleirosei

回答

2

的問題是,你的def color是一個屬性讀者不是作家。所以它會一直返回默認顏色black,每個參數。

當你做對分配:

phone.color = "green" 

它調用隱含的作家(由attr_accessor :color生成)。屬性作家會是什麼樣子:

def color=(c) 
    @color = c 
end 

顏色寫 '綠色' 後,你嘗試通過訪問:

puts phone.color 

這將執行屬性讀者:

def color(c='black') 
    @color=c 
end 

它將顏色設置爲「黑色」並返回該顏色。

如果你想有一個默認的黑色爲主色調,你可以定義你的類是這樣的:

class Phone 
    attr_reader :name 
    attr_reader :manufacturer 
    attr_accessor :color   # This generates your reader and writer methods 

    def initialize(name, manufacturer) 
    @name   = name 
    @manufacturer = manufacturer 
    end 

    def color 
    @color || 'black' # If @color is nil, return 'black', otherwise @color 
    end 
end 

2.0.0-p195 :012 > phone = Phone.new("Moto X", "Motorola") 
=> #<Phone:0x9ecc1ac @name="Moto X", @manufacturer="Motorola"> 
2.0.0-p195 :013 > phone.color 
=> "black" 
2.0.0-p195 :014 > phone.color = "green" 
=> "green" 
2.0.0-p195 :015 > phone.color 
=> "green" 
+0

這很有道理。這是我第一次真正瞭解attr_accessor做什麼的程度。我非常感謝它的男人。 – Pleirosei

+1

優秀的答案,mbratch。 –