无法将字符串写入ruby中的属性访问器

无法将字符串写入ruby中的属性访问器,ruby,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" 因为当我执

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

因为当我执行它时,我得到了#(NoMethodError)

未定义的方法'titles='。您正在为
图书标题
添加一个
属性访问器
,而不是
标题
(这根本不是一个变量)。你需要打电话

puts @book.book_titles = "Steve Jobs"
以设置(和打印)标题

如果您试图将标题传递给
titles
,并让该方法将标题大写并将
@book\u title
设置为该标题,则需要使用
=
将其声明为赋值方法,传入参数
title
,并实际将
@book\u title
设置为该标题。像这样的

def titles= title
  @book_title = title.capitalize
end
当前,您的
titles
方法只返回大写的局部变量
book\u title
,该变量不存在(它需要
@
来引用实例变量)。

它说的是“undefined method titles=”因为您尚未定义名为
titles=
的方法。相反,
attr\u accessor
(Ruby的众多方法之一)定义了两个方法,在您的例子中,分别命名为
book\u title
book\u title=
。然后添加
标题
。所有这些都未命名为
标题=
(等号有效)

你的
标题
方法(顺便说一句,你应该弄清楚它是单数还是复数)与
书名
是多余的,这会导致混淆。作为第一次看到这段代码的人,或者在休息后再次看到这段代码的人,我如何知道调用哪个方法


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

是的,但你知道我也想利用它。我想知道如何通过一种方法传递它或在书名上书写,所以如果以后我传入
put@book.titles=“james”
。它也应该大写james to james。将我的答案编辑为作业方法。我认为这就是你想要的(尽管你可能需要对资本化方面进行调整),但它不接受=。例如
put@book.titles=“steve jobs”
。而且已经有了一个“``attr\u accessor:book\u title````。是的,对于
book\u title
有一个
attr\u accessor
,但是对于
title
没有,所以你需要为
titles
定义一个阅读器。你创建了
titles
,但是调用了
titles=/code>。那么你的意思是
def titles=(value)
?在这种情况下,我得到了
未定义的方法'capitalize'
。类似这样的东西。但不起作用。它返回字符串而不大写。当你在赋值过程中放置时,事情会变得很奇怪(不知道为什么)。试试
@book.title='mobydick';放置@book.title(请参阅my以了解结果为何为“白鲸”
)。