0

ここで私が間違っていることを教えてください。メソッドを介してコードの後半に追加される文字列を大文字にできるようにしたいと思いますtitles

class Book
  attr_accessor :book_title

  def initialize
       @book_title = String.new
     end

  def titles
    book_title.capitalize
  end

end

@book = Book.new
puts @book.titles = "steve jobs"

実行するとundefined method `titles=' for #<Book:0x007fbd25813d98 @book_title=""> (NoMethodError)

4

2 に答える 2

2

あなたが何を達成しようとしているのかは少し不明確です。attr_accessorforbook_titleではなくforを追加していますtitles(これは変数ではありません)。あなたは電話する必要があります

puts @book.book_titles = "Steve Jobs"

タイトルを設定(および印刷)するため。

タイトルをに渡そうとしtitlesていて、そのメソッドにタイトルを大文字にしてそれに設定さ@book_titleせる場合は、を使用して割り当てメソッドとして宣言し=、パラメータを渡して、title実際にそれに設定@book_titleする必要があります。このようなもの

def titles= title
  @book_title = title.capitalize
end

現在、titlesメソッドは大文字のローカル変数のみを返しますがbook_title、これは存在しません(@インスタンス変数を参照する必要があります)。

于 2013-02-11T15:12:59.107 に答える
0

。という名前のメソッドを定義していないため、「undefinedmethodtitles=」と表示されtitles=ます。代わりに、attr_accessor(Rubyの多くの誤解を招く名前の1つ)は2つのメソッドを定義します。あなたの場合はnamedbook_titlebook_title=。次に、を追加しtitlesます。これらはいずれも名前が付けられていませんtitles=(等号は重要です)。

あなたのtitles方法(ちなみに、それが単数形か複数形かを理解する必要があります)は、と冗長でありbook_title、混乱を招きます。このコードを初めて見た人、または休憩後にもう一度見た人として、どのメソッドを呼び出すかをどのように知ることができますか?

途中(セッター中)または途中(ゲッター中)に文字列を大文字にするかどうかを決定する必要があります。何をするにしてもattr_accessor、少しの間使用をやめ、ゲッターとセッター(def titleおよびdef title=)が何をするのかが明確になるまで明示的に定義することをお勧めします。attr_accessorマクロは単なる省略形です。あなたは最初にロングハンドを学ぶべきです。

于 2013-02-11T15:36:45.783 に答える