Ruby 属性访问器与方法同名时如何打印属性访问器值
我有一个类Ruby 属性访问器与方法同名时如何打印属性访问器值,ruby,Ruby,我有一个类Book,它有一个实例变量title和一个方法title class Book attr_accessor :title def title(title) @title = title.capitalize end end 我创建了一个book对象 b = Book.new 然后我设置了标题 b.title("inferno") 现在,当我尝试打印title字段变量值时 p b.title Ruby认为我正在尝试调用该方法 “标题”:参数数量错误 知道如何打
Book
,它有一个实例变量title
和一个方法title
class Book
attr_accessor :title
def title(title)
@title = title.capitalize
end
end
我创建了一个book对象
b = Book.new
然后我设置了标题
b.title("inferno")
现在,当我尝试打印title字段变量值时
p b.title
Ruby认为我正在尝试调用该方法
“标题”:参数数量错误
知道如何打印字段变量值吗
谢谢我想您想要设置标题的是:
def title=(str)
super str.try(:capitalize)
end
我认为你想要设置标题的是:
def title=(str)
super str.try(:capitalize)
end
所有的
attr\u访问器:title
都是创建包装器方法,与def title()
和def title=(value)
相同。这只是一个语法糖方法生成。然后,可以使用以下选项设置该值:
b.title = "Whatever"
并通过以下方式访问:
b.title
如果您只是想要一个读者或作家,您可以分别使用attr\u reader:title
或attr\u writer:title
如果您想手动创建自己的读写器方法,则上述所有操作都是创建:
def title
@title
end
def title=(value)
@title = value
end
在Ruby中,不能有两个具有相同名称和不同算术的方法,因此当您定义自己的方法(如您的问题中所述)时,您将用编写器覆盖reader方法。这就给你留下了两种设置的方式,而没有阅读的方式
您可以使用attr\u reader
和自定义编写器:
def title=(value)
@title = value.capitalize
end
您可以随时根据需要为方法命名,如
def capitalize\u和\u set\u title(value)
。这可能比attr\u访问器
和运算符重载的魔力更清楚。所有attr\u访问器:title
所做的是创建包装器方法,与def title()
和def title=(value)
相同。这只是一个语法糖方法生成。然后,可以使用以下选项设置该值:
b.title = "Whatever"
并通过以下方式访问:
b.title
如果您只是想要一个读者或作家,您可以分别使用attr\u reader:title
或attr\u writer:title
如果您想手动创建自己的读写器方法,则上述所有操作都是创建:
def title
@title
end
def title=(value)
@title = value
end
在Ruby中,不能有两个具有相同名称和不同算术的方法,因此当您定义自己的方法(如您的问题中所述)时,您将用编写器覆盖reader方法。这就给你留下了两种设置的方式,而没有阅读的方式
您可以使用attr\u reader
和自定义编写器:
def title=(value)
@title = value.capitalize
end
您可以随时根据需要为方法命名,如
def capitalize\u和\u set\u title(value)
。这可能比attr\u accessor
和运算符重载的魔力更清楚。如果您希望能够使用title(某些值)
设置值,并使用title
读取值(无参数),您可以执行以下操作:
class Book
def title(title = :no_value_given)
if title == :no_value_given
@title
else
@title = title.capitalize
end
end
end
当您在没有参数的情况下调用它时,它依赖于默认参数值
我没有使用
nil
作为默认参数值的原因是,如果希望能够使用title(某些值)
设置值,并使用title
(无参数)读取该值,则可以将该值设置为nil
,例如:
class Book
def title(title = :no_value_given)
if title == :no_value_given
@title
else
@title = title.capitalize
end
end
end
当您在没有参数的情况下调用它时,它依赖于默认参数值
我没有使用nil
作为默认参数值的原因是,您可以将该值设置为nil