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_accessorfor book_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

它说“未定义的方法标题=”,因为您还没有定义一个名为titles=. 相反,attr_accessor(Ruby 的许多误导性名称之一)定义了两种方法,在您的情况下名为book_titleand book_title=。然后你添加titles. 这些都没有被命名titles=(等号很重要)。

您的titles方法(顺便说一句,您应该弄清楚它是单数还是复数)与 冗余book_title,这会导致混乱。作为第一次看到这段代码的人——或者在休息后再次看到这段代码——我怎么知道要调用哪个方法?

您需要决定是在输入时(在 setter 期间)还是在输出时(在 getter 期间)将字符串大写。无论您做什么,我都建议您暂时停止使用attr_accessor,并明确定义一个 getter 和一个 setter ( def titleand def title=),直到您清楚它们在做什么。attr_accessor宏只是一个简写;你应该先学习速记。

于 2013-02-11T15:36:45.783 回答