当属性访问器与方法同名时,如何打印属性访问器值

时间:2016-11-26 21:49:51

标签: ruby

我的课程Book包含实例变量title和方法title

class Book
  attr_accessor :title
  def title(title)
    @title = title.capitalize
  end
end

我创建了一个图书对象

b = Book.new

然后我设置了标题

b.title("inferno")

现在,当我尝试打印标题字段变量值

p b.title

Ruby认为我正在尝试调用方法

  

“title”:参数数量错误

知道如何打印字段变量值吗?

由于

3 个答案:

答案 0 :(得分:5)

所有attr_accessor :title都会创建包装方法,与def title()def title=(value)相同。它只是一个语法糖方法生成。然后,您可以使用以下值设置值:

b.title = "Whatever"

并访问:

b.title

如果您只是想要读者或作者,可以单独使用attr_reader :titleattr_writer :title

如果您想手动制作自己的读写器方法,以上所有操作都是创建:

def title
  @title
end

def title=(value)
  @title = value
end

Ruby中不能有两个具有相同名称和不同arity的方法,因此当您定义自己的方法时(如在您的问题中),您将使用您的编写器覆盖reader方法。这让你有两种设置方式,无法阅读。

您可以使用attr_reader和自定义编写器:

def title=(value)
  @title = value.capitalize
end

您始终可以根据需要为方法命名,例如def capitalize_and_set_title(value)。它可能比attr_accessor和运算符重载的魔力更清晰。

答案 1 :(得分:0)

我认为你想要设置标题的是:

def title=(str)
  super str.try(:capitalize)
end

答案 2 :(得分:0)

如果您希望能够使用title(some_value)设置值并使用title(不带参数)进行读取,则可以执行以下操作:

class Book
  def title(title = :no_value_given)
    if title == :no_value_given
      @title
    else
      @title = title.capitalize
    end
  end
end

当你不带参数调用它时,它依赖于默认参数值。

我没有使用nil作为默认参数值的原因是您可以将值设置为nil