`name':错误的参数个数(1表示0)(ArgumentError)

时间:2015-09-26 14:11:47

标签: ruby

要为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)   

表示方法名称(设置者)。

为什么会这样?

2 个答案:

答案 0 :(得分: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方法名称包含=

答案 1 :(得分: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