Ruby没有“def”添加getter和setter?

时间:2014-03-11 08:50:42

标签: ruby class setter getter function

我必须将getter和setter添加到类似Book的类:

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

对于一个二传手。我甚至不知道吸气剂应该是什么样的。 有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

Ruby允许您使用方法attr_accessorattr_readerattr_writer定义简单的getter / setter。在您的示例中,您可以使用attr_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_accessor :title等同于定义以下几种方法:

def title
  @title
end

def title=(new_title)
  @title = new_title
end

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

答案 1 :(得分:1)

使用attr_accessor

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

答案 2 :(得分:1)

您也可以使用attr_accessor(或attr_readerattr_writer

答案 3 :(得分:1)

使用define_method动态定义您的方法。在这种情况下,直接使用attr_accessor也应该有效。它将隐式定义getter和setter。