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