2014-03-03 114 views
0

試圖瞭解如何使用setter methods爲什麼我在這裏失敗?我不明白我做錯了什麼。有人可以解釋嗎?謝謝。Ruby中的類,對象和setter方法?

class Book 
    def title=(title) 
    @title = title.capitalize 
    end 
end 

Rspec的

describe Book do 
    before do 
    @book = Book.new 
    end 

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

測試失敗:

Book title should capitalize the first letter Failure/Error: @book.title.should == "Inferno"

NoMethodError:

undefined method `title' for #<Book:0x00000104abd538 @title="Inferno"> 
# ./ct.rb:865:in `block (3 levels) in <top (required)>' 

回答

4

當你這樣做:

@book.title.should == "Inferno" 

喲你實質上是在Book對象上調用title方法,這當然不存在。您只定義了設置器

你也必須定義吸氣

class Book 
    def title 
    @title 
    end 

    # ... 
end 

請注意,沒有定義這兩個調節器和吸氣的縮寫:

class Book 
    attr_accessor :title 
end 
+0

是有道理的。問題:爲什麼這不起作用? '@title = title.split.each {| w | w.capitalize} .join(「」)'預計:「Stuart Little」,但會得到:「stuart little」。爲什麼不在這裏利用工作? – fyz

+1

這是一個完全不同的問題,但在這裏你會發現:'each'遍歷一個集合,但不會修改它。使用'map'代替:'@title = title.split.map(&:capitalize).join('')' – Agis

+1

@Agis:看起來你正在追求飢餓。做得好! – Bala