0

現在、rspec ruby​​ チュートリアルを行っています。問題の 1 つは、英語の大文字化規則のいくつかを利用する book_title プログラムを作成することを要求します。テストは非常に長いですが、何を求めているかについていくつかのアイデアを提供するために、最初の最後のテストを以下に含めました。

require 'book'

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

   specify 'the first word' do
       @book.title = "the man in the iron mask"
       @book.title.should == "The Man in the Iron Mask"
     end
    end
  end
end

私のコードは次のとおりです。

class Book
    attr_accessor :title

    def initialize(title = nil)
        @title = title
    end

    def title=(book_title = nil)
        stop_words = ["and", "in", "the", "of", "a", "an"]
        @title = book_title.split(" ").each{ |word| 
            unless stop_words.include?(word)
                word.capitalize!
            end}.join(" ").capitalize
    end
end 

私が抱えているこの問題は、def title=メソッドにあります。@title = book_title.split(...など) すべて 1 行にまとめました。分割しようとすると、以前のテストの多くが失敗するためです。

私が試したコードの例:

    @title = book_title.split(" ").each do |word|  # attempting to add words to an array
        unless stop_words.include?(word)           # to capitalize each word
          word.capitalize!
        end
      end
        @title.join(" ")                               # Joining words into one string
        @title.capitalize                              # Capitalizing title's first word
    end                                                # to follow the last test

これを試すと、テストは失敗します (@title#join と @title#capitalize を試すときに、@title を再度呼び出す必要があると考えています)。

他のいくつかの考え: 最初の部分 (word.capitalize! end end別の変数 (おそらく book_title または new_title) で終わる最も長い行) を設定することだけを考えていましたが、@title を初期化または使用する理由がそもそも何なのか疑問に思っていました。

よりクリーンなコードの編集だけでなく、入力も大歓迎です

4

1 に答える 1

2

2 番目の例で発生している問題は、呼び出さArray#eachれた列挙型を返す.eachことです。そのため、この場合はbook_title.split(" ")(ブロックによって変更されていますが) 結果を取得しています。この結果を@titleインスタンス変数に代入しています。配列を呼び出すjoinと文字列が返されますが、その文字列を割り当てる以外に何もしていません。title 変数に割り当てたい場合は、@title = @title.join(" "). と同じcapitalize

于 2013-09-10T00:45:05.820 に答える