为Dessert
类创建setter和getter,我编写了以下代码:
class Dessert
def initialize(name,calories)
@name=name
@calories=calories
end
def name
@name
end
def name=(names)
@name=names
end
def calories
@calories
end
def calories=(calory)
@calories=calory
end
end
d=Dessert.new("Salad",1200)
puts d.name("Khoresht")
puts d.calories(1600)
puts d.name()
puts d.calories()
setter和getter必须具有相同的名称,编译器通过它们的签名来识别它们。但是在这里,我遇到了错误:
`name': wrong number of arguments (1 for 0) (ArgumentError)
为方法名(setter)。
为什么会发生?
你应该把d.name("Khoresht")
改成d.name=("Khoresht")
d=Dessert.new("Salad",1200)
d.name = "Khoresht" # use setter method, equal to d.name=("Khoresht")
d.calories = 1600
puts d.name
puts d.calories
setter和getter有不同的名字,在你的代码中,setter方法的名字包含一个=
胖胖已经回答了你的问题。我只是想提一下,在Ruby中定义getter和setter方法是不常见的。
一种常见的方法是使用attr_accessor
来声明getter和setter方法。下面的示例相当于您的代码:
class Dessert
attr_accessor :name, :calories
def initialize(name, calories)
@name = name
@calories = calories
end
end
和其他选项可能是从Struct
继承。下面的示例与您的代码具有相同的行为:
class Dessert < Struct.new(:name, :calories)
end