【发布时间】:2014-11-25 18:01:29
【问题描述】:
下面的节目是试图接纳一位美国总统、法国总统的年龄和姓名。问题是法国总统在说出他的名字、年龄和公民身份后会说“bein sur”(不是我的想法)。我对这位法国总统的标语有意见。这是我的代码
class President
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
def name=(name) # setter
@name = name
end
def name # getter
@name
end
def age=(age)
@age = age
end
def age
@age
end
end
class FrancePresident < President
def self.citizenship
"La France"
end
def initialize(name, age)
super(name)
super(age)
end
def catchphrase
"bein sur"
end
end
class UnitedStatesPresident < President
def self.citizenship
"The Unites States of America"
end
end
我为他的流行语使用的实例方法是许多人中最后一次尝试让这个人说出这个短语,但它不完整,我想我应该定义对超类的调用以获取他的名字和年龄,但我不确定如何克服这个参数错误。
ArgumentError
wrong number of arguments (1 for 2)
exercise.rb:4:in `initialize'
exercise.rb:32:in `initialize'
exercise_spec.rb:24:in `new'
exercise_spec.rb:24:in `block (3 levels) in <top (required)>'
我是 ruby 的新手,所以任何提示或建议将不胜感激。
【问题讨论】:
-
你的
def age/def age=()(和name也是)是多余的,因为attr_accessor :name, :age自动定义那些其他方法正是attr_accessor完成的,所以你不需要自己定义它们. -
哦,所以
attr_accessor就像一个内置的getter 和setter? -
标语应为“bien sûr” :) 来源:translate.google.com/#en/fr/of%20course
-
@ClydeBrown 是的,它是定义您定义的确切简单 getter/setter 的简写。如果您必须在 setter 或 getter 中做更多工作(例如验证),您需要自己定义它们,但
attr_accessor会生成您为 getter/setter 包含的代码。 -
@ClydeBrown 如果您在这些对象上调用
attr_accessor,然后调用President.new.methods,您会在其可用的实例方法中找到age, age=, name, name=。
标签: ruby-on-rails ruby superclass