如何打印属性访问器的值时,属性访问器具有相同的名称,方法
问题描述:
我有一个类Book
用一个实例变量title
和方法title
如何打印属性访问器的值时,属性访问器具有相同的名称,方法
class Book
attr_accessor :title
def title(title)
@title = title.capitalize
end
end
我创建了一本书对象
b = Book.new
然后我设置标题
b.title("inferno")
现在,当我尝试t Ø打印标题字段变量值
p b.title
红宝石认为我想调用的方法
“称号”:错误的参数数目
任何想法如何打印字段变量值?
感谢
答
所有attr_accessor :title
所做的是创建包装方法,相同的def title()
和def title=(value)
。这只是一个语法糖方法一代。然后,您可以设定值:
b.title = "Whatever"
和访问有:
b.title
如果你只是想一个阅读器或一个作家,你可以使用attr_reader :title
或attr_writer :title
分开。
如果你想手动制作自己的读/写器的方法,上述所有要做的就是创建:
def title
@title
end
def title=(value)
@title = value
end
你不能有两个方法:用Ruby中相同的名字和不同的元数,所以当你定义了你自己的方法(就像你的问题),你正在用作者覆盖读者的方法。这给你留下了两种设置方式,无法阅读。
你可以使用attr_reader
和一个自定义的作家:
def title=(value)
@title = value.capitalize
end
你总是可以命名你想要的任何方法,如def capitalize_and_set_title(value)
。这可能比attr_accessor
的魔术和运算符重载更清晰。
答
我认为你为了设置标题想要的是:
def title=(str)
super str.try(:capitalize)
end
答
如果你希望能够与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
。