2013-10-18 28 views
0

我分配給寫一些紅寶石代碼將與rspec的試驗中,以下(A段)工作的結果的方法,包括:發生改變的設定器

before do 
    @book = Book.new 
end 

describe 'title' do 
    it 'should capitalize the first letter' do 
    @book.title = "inferno" 
    @book.title.should == "Inferno" 
    end 

這是解決方案,但我不不懂它:

class Book 
    attr_reader :title 

    def title=(new_title) 
    words = new_title.split(" ") 
    words = [words[0].capitalize] + 
     words[1..-1].map do |word| 
     little_words = %w{a an and the in of} 
     if little_words.include? word 
      word 
     else 
      word.capitalize 
     end 
     end 
    @title = words.join(" ") 
    end 

end 

我想我是正確的推斷,@book.title = "inferno"將運行title方法,並最終在底部的@title變量創建一個新的價值。我知道這導致@book.title更新爲「地獄」(大寫),但我不知道爲什麼。這是一種def title作爲某種可變方法的情況,並且@title是最終值嗎?這是我最好的猜測。

編輯萬一它不清楚,我不明白爲什麼設置@book.title ='inferno'導致@book.title更新爲「地獄」。

+1

你的問題不清楚給我..什麼讓你困惑在這段代碼? –

+0

@ arup-rakshit聲明'@book.title ='inferno''導致'@ book.title'更新爲「地獄」,但我不知道爲什麼。 – macsplean

回答

2

當你在Ruby的setter和getter方法:

attr_writer :something 
attr_reader :something 

從我的這個小小的理解,這些方法等同於

def something=(value) 
    @something = value 
end 

def something 
    @something 
end 

分別。

或者在一個聲明中,它可能是:

attr_accessor :something 

不管怎樣,你在做什麼是自己寫setter方法,資本作爲參數傳遞的字符串的每一個字。

+0

謝謝。我很難理解最後一部分,可以從根本上更新setter代碼以包含方法代碼。 – macsplean

2

你的理解幾乎是正確的。這裏是一個簡單的例子

class Chapter 
    attr_reader :title 
    def title=(new_title) 
    @title = new_title.reverse 
    end 
end 

@c = Chapter.new 
@c.title = "ybuR" 
@c.title #=> Ruby