'名':错误的参数数目(1 0)(引发ArgumentError)
问题描述:
为了使制定者和Dessert
类消气,我做了下面的代码:'名':错误的参数数目(1 0)(引发ArgumentError)
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方法名称包含=
。
答
pangpang已经回答了你的问题。我只想提到在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
带结构的版本有差异:'Dessert.new'中的参数是可选的,有一个默认的nil。 – knut
@knut:是的,你说得对。我忘了那个区别。 – spickermann