1

私は現在 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

クラス Book を作成し、そのクラス内に大文字化するメソッドを作成します。ただし、これをコーディングする方法についての私の考えは完全に間違っています (この場合に機能するコードの例を見てきました)。

私がやろうとしたこと:

class Book
    def initialize(book)
        @book = book
    end

    def title(@book)
        @book.capitalize
    end
end

最終的に機能したソリューション:

class Book

    attr_reader :title

    def initialize(title=nil)
      @title = title && title.capitalize!
    end

    def title=(new_title)
        @title = new_title && new_title.capitalize!
    end
end

@ の意味がよくわかりません。クラス全体で機能する変数を作成することだと思いました。さらに、@book (rspec テストで指定) の代わりに @title が使用される理由が気になります。

さらに、コードの「実行前」の部分と、@book = Book.new を要求する理由に苦労しています。

また、&& の部分も紛らわしいです。@title = title.capitalize だけではなぜダメなのですか!

これが意味をなさない場合は、喜んで明確にします (この投稿が長いことは承知しています)。

4

1 に答える 1

2

@ は Ruby の基本的な構成要素であり、クラスのインスタンス変数です。したがって、クラスのメソッド内でパラメーターとして渡す必要はありません。クラスのインスタンス全体で認識されます。詳細については、たとえば、インスタンス変数とアクセサーを参照してください。

したがって、インスタンス変数をメソッド パラメーターとして渡さないため、以下は実際には有効ではありません。

def title(@book)
    @book.capitalize
end

&&、最初のステートメントが true かそうでない場合にのみ、2 番目のステートメントに進みnilます。例えば

def initialize(title=nil)
  @title = title && title.capitalize!
end

issでない限り、クラスのインスタンス変数@titleをパラメーターに設定します。が の場合、は(つまり、 )に設定されます。そのため、クラスがパラメーターなしで作成された場合、 thenが設定され、メソッドで呼び出してもエラーは生成されません。title.capitalize!titleniltitlenil@titletitlenil@titlenilnilcapitalize!

于 2013-09-03T23:24:01.093 に答える