2017-05-31 3 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 initializer"を実行しなければならず、body変数に以下のようなメソッドを渡します:capital_it(@title)。 – springathing

答えて

2

attr_accessorまたはdef title ...? title( "リーダー")とtitle=( "作家"):

attr_accessor :titleはあなたのための2つのメソッドを定義します。 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. あなたは、おそらくこのlittle_words.include?(word) ? word : word.capitalize

P.S.に条件word.capitalize! unless little_words.include?(word)を書き換える必要がありますあなたの場合は、要素の各文字列にcapitalize!を使用しているために動作しますが、そのような書式のスタイルは良くありません。

だから、私はこの1つのようにあなたのクラスを書くためにあなたをお勧めします:引数が最初に行くん

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

多くの人が見た「私的」のポイントは何ですか?ソリューションはまだ私はその理由の背後にある理由を見つけることができません。私はそれがあなたのウェブサイトやプログラムのユーザーからのコードを隠すためのものだと思った。 – springathing

+0

@stringathingそれは[encapsulation]に関するものです(https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)) – DjezzzL

関連する問題