2016-11-26 78 views
1

我有一个类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 

红宝石认为我想调用的方法

“称号”:错误的参数数目

任何想法如何打印字段变量值?

感谢

回答

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中相同的名字和不同的元数,所以当你定义了你自己的方法(就像你的问题),你正在用作者覆盖读者的方法。这给你留下了两种设置方式,无法阅读。

你可以使用attr_reader和一个自定义的作家:

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

你总是可以命名你想要的任何方法,如def capitalize_and_set_title(value)。这可能比attr_accessor的魔术和运算符重载更清晰。

0

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

def title=(str) 
    super str.try(:capitalize) 
end 
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