请告诉我这里我做错了什么。我希望能够通过方法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)
答案 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_title
和book_title=
。然后添加titles
。这些都不是titles=
(等号是重要的)。
你的titles
方法(顺便提一下,你应该弄清楚它是单数还是复数)与book_title
是多余的,这会导致混淆。当有人第一次看到这段代码时 - 或者在休息后再次看到 - 我怎么知道要调用哪种方法?
您需要决定是在(在设置者中)还是在出路(在getter期间)的路上大写字符串。无论你做什么,我建议你停止使用attr_accessor
一点,然后明确定义一个getter和一个setter(def title
和def title=
),直到你脑海中清楚地知道什么他们是这样。 attr_accessor
宏只是一个简写;你应该先学习速记。