2015-09-26 75 views
0

为了使制定者和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)。

为什么发生?

回答

2

你应该改变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方法名称包含=

2

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 
+0

带结构的版本有差异:'Dessert.new'中的参数是可选的,有一个默认的nil。 – knut

+0

@knut:是的,你说得对。我忘了那个区别。 – spickermann

相关问题