2017-05-31 47 views
0

我在教自己如何編碼,似乎無法理解輸入的標題是如何被這個類調用的。爭論首先在哪裏? attr_accessor或def標題capital_it(@title)結束?書本大寫類錯誤

class Book 

    attr_accessor :title 

    def title 
     capital_it(@title) 
    end 

    def capital_it(title) 
     word_arr = @title.capitalize.split(" ") 
     word_arr.map do |word| 
      word.capitalize! unless little_words.include?(word) 
      end 
     word_arr.join(" ") 
    end 

    def little_words 
     ["the", "a", "an", "and", "in", "of"] 
    end 

end 
+2

錯誤消息在那裏指導你。在你的'capital_it'方法中,你的'map''do'缺少'end'。 –

+0

根據你的'initialize'方法,當你用'Book.new'創建一本新書時,你必須傳遞一個參數,即'@book = Book.new('title')'。 –

+0

我似乎無法理解參數是如何通過類傳遞的,以及每種方法基於如何使用實例變量設置的函數。 我得到了規範工作,但我必須做「def初始值設定項」沒有參數,並在身體通過像這樣的方法傳遞實例變量:capital_it(@title)。 – springathing

回答

2

哪裏的論據去第一? attr_accessordef title ...?

attr_accessor :title爲您定義兩種方法:title(以下簡稱 「讀本」)和title=(下稱 「作家」)。當您在attr_accessor之後執行def title時,您完全用新方法替換title方法。

換句話說,由attr_accessor生成的方法永遠不會被調用,因爲您已經用自己的方法覆蓋了它。

既然你寫你自己的「閱讀器」的方法,你應該只使用attr_writer

class Book 
    attr_writer :title 

    def title 
    capital_it(@title) 
    end 

    # ... 
end 
1

首先,您在def capital_it(title)方法中遇到了問題。

  1. .map方法將返回一個你沒有分配給任何東西的新數組。如果您想將其重新分配給本地變量word_arr,請改爲使用.map!
  2. 你或許應該重寫條件word.capitalize! unless little_words.include?(word)這個little_words.include?(word) ? word : word.capitalize

附:在你的情況下,它的作品,因爲你使用capitalize!每個元素的字符串,但寫作的風格是不好的。

所以我建議你寫你的類像這樣的:

class Book 
    SKIP = %w(the a an and in of) 

    attr_writer :title 

    def initialize(title) 
    @title = title 
    end 

    def title 
    capital(@title) 
    end 

    private 

    def capital(title) 
    array = @title.split(/\s+/) 
    array.map! do |word| 
     SKIP.include?(word) ? word: word.capitalize 
    end 
    array.join(" ") 
    end 
end 
+0

我在很多人看到過的「private」的意義何在?解決方案,但我找不到爲什麼使用它的原因。我認爲這是爲了隱藏你的網站或程序用戶的代碼 – springathing

+0

@stringathing這是關於[封裝](https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)) – DjezzzL