无法在ruby中将字符串写入attr_accessor

时间:2013-02-11 15:08:17

标签: ruby

请告诉我这里我做错了什么。我希望能够通过方法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)

2 个答案:

答案 0 :(得分:2)

关于你想要完成什么,有点不清楚。您为attr_accessor添加了book_title,而不是titles(根本不是变量)。你需要打电话

puts @book.book_titles = "Steve Jobs"

以设置(和打印)标题。

如果您尝试将标题传递给titles并让该方法将标题大写并将@book_title设置为该标题,则需要使用=将其声明为分配方法,传递参数title,并实际设置@book_title。像这样的东西

def titles= title
  @book_title = title.capitalize
end

目前,您的titles方法仅返回大写的局部变量book_title,该变量不存在(需要@来引用实例变量)。

答案 1 :(得分:0)

它说的是“未定义的方法标题=”,因为您尚未定义名为titles=的方法。相反,attr_accessor(Ruby的许多misleading names之一)定义了两种方法,在您的案例中名为book_titlebook_title=。然后添加titles。这些都不是titles=(等号是重要的)。

你的titles方法(顺便提一下,你应该弄清楚它是单数还是复数)与book_title是多余的,这会导致混淆。当有人第一次看到这段代码时 - 或者在休息后再次看到 - 我怎么知道要调用哪种方法?

您需要决定是在(在设置者中)还是在出路(在getter期间)的路上大写字符串。无论你做什么,我建议你停止使用attr_accessor一点,然后明确定义一个getter和一个setter(def titledef title=),直到你脑海中清楚地知道什么他们是这样。 attr_accessor宏只是一个简写;你应该先学习速记。