0

私は、次の (a の一部) rspec テストで動作する ruby​​ コードを書くように割り当てられています。

before do
  @book = Book.new
end

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

これは解決策ですが、私はそれを理解していません:

class Book
  attr_reader :title

  def title=(new_title)
    words = new_title.split(" ")
    words = [words[0].capitalize] +
      words[1..-1].map do |word|
        little_words = %w{a an and the in of}
        if little_words.include? word
          word
        else
          word.capitalize
        end
      end
    @title = words.join(" ")
  end

end

@book.title = "inferno"メソッドを実行し、最終的に下部の変数にtitle新しい値を作成すると推測するのは正しいと思います。@titleこれにより「インフェルノ」(大文字)に更新されることはわかっていますが、その理由はわかり@book.titleません。これはdef titleある種の変数メソッドであり@title、それが最終値である場合ですか? それが現時点での私の最良の推測です。

明確でない場合の編​​集、私が理解していないのは、設定@book.title ='inferno'@book.title「インフェルノ」に更新される理由です。

4

2 に答える 2

2

Ruby にセッター メソッドとゲッター メソッドがある場合:

attr_writer :something
attr_reader :something

これについての私のほとんどの理解から、これらのメソッドは以下と同等です

def something=(value)
  @something = value
end

def something
  @something
end

それぞれ。

または、1 つのステートメントでは、次のようになります。

attr_accessor :something

とにかく、あなたがやっていることは、引数として渡された文字列の各単語を大文字にして、setter メソッドを自分で書くことです。

于 2013-10-18T06:49:28.827 に答える
2

あなたの理解はほぼ正しいです。ここに簡単な例があります

 class Chapter
   attr_reader :title
   def title=(new_title)
     @title = new_title.reverse
   end
 end

 @c = Chapter.new
 @c.title = "ybuR"
 @c.title #=> Ruby
于 2013-10-18T06:57:52.683 に答える