Ruby添加不带“的getter和setter;def";?

Ruby添加不带“的getter和setter;def";?,ruby,class,setter,getter,function,Ruby,Class,Setter,Getter,Function,我必须向类书中添加getter和setter,如下所示: class Book def initialize (title, author, pages, year) @title = title @author = author @pages = pages @year = year end end 问题是不允许我使用def。有可能吗? 我知道的唯一方法是使用: def change_name(name) @name = name end

我必须向类书中添加getter和setter,如下所示:

class Book
  def initialize (title, author, pages, year)
    @title = title 
    @author = author 
    @pages = pages 
    @year = year
  end
end
问题是不允许我使用
def
。有可能吗? 我知道的唯一方法是使用:

def change_name(name)
  @name = name
end
作为二传手。我甚至不知道一个能干的人应该是什么样子。
有什么帮助吗?

使用
attr\u访问器

class Book
  attr_accessor :title, :author, :pages, :year
  def initialize (title, author, pages, year)
    @title = title 
    @author = author 
    @pages = pages 
    @year = year
  end
end

您还可以使用
attr\u访问器
(或
attr\u阅读器
attr\u编写器

Ruby让您使用这些方法定义简单的getter/setter,以及。在您的示例中,您可以使用
attr\u accessor
为实例变量定义getter和setter:

class Book

  attr_accessor :title, :author, :pages, :year

  def initialize (title, author, pages, year)
    # same as before...
  end
end

book = Book.new('foo', 'bar', 100, 2010)
book.title
# => "foo"

book.title = 'baz'
book.title
# => "baz"
调用
attr\u accessor:title
相当于定义以下两种方法:

def title
  @title
end

def title=(new_title)
  @title = new_title
end

您可以在Ruby文档中找到更多关于(即名称以
=
结尾的方法)的信息。

使用
define\u method
动态定义您的方法。在这种情况下,直接使用
attr\u访问器
也应该有效。它将隐式地为您定义getter和setter。

出于好奇-为什么不允许使用
def
?getter只是一个返回实例变量的方法。例如,name实例变量的getter可以是:(
def name return name end
)@IdanArye,可能是因为这是他的家庭作业。:)显然这是我的家庭作业。我甚至不认为不使用它:)它是Ruby特性,因此也适用于Rails。显然是重复的。