我正在尝试理解Ruby中的继承系统。这是我的代码:
class Man
attr_accessor :name
def initialize(name = "Foo")
@name = name
end
end
class User < Man
attr_accessor :mail
def initialize(mail = "bar")
super
@mail = mail
end
end
这是我的考验:
man = Man.new
man
=> #<Man:0x007fb68da4a768 @name="Foo">
user = User.new
user
=> #<User:0x007fb68da442c8 @name="bar", @mail="bar">
我不明白为什么用户的@name不是“Foo”! Normaly,它应该是因为它是man初始化方法中的默认参数,不是吗?
感谢您的帮助!
答案 0 :(得分:3)
super
(没有参数列表)使用传入的相同参数调用超类中的相同方法。如果要显式传递 no 参数,你必须使用空参数列表:super()
。
请记住:super
不是方法调用,它是关键字,关键字不必遵循常规方法调用评估规则。这是其中一个差异。对于方法调用,foo
和foo()
是等效的,它们都不传递任何参数。对于super
,是的区别:super()
不传递参数,super
转发参数。
现在,这是一个额外的转折:实际上,你不将任何参数传递给initialize
,那么它们如何被传递......或者你呢?好吧,事实证明,为了调用super
,可选参数的默认参数被视为已经显式传递。
答案 1 :(得分:2)
super
是传递传递给当前正在执行的方法的相同参数的快捷方式。在你的例子中,&#34; bar&#34;被隐含地传递给了超级班(这就是为什么你得到的&#34; bar&#34;对于他们两者而言)。
避免混淆的可选解决方案:
class User < Man
attr_accessor :mail
def initialize(name = "foo", mail = "bar")
super(name)
@mail = mail
end
end
答案 2 :(得分:0)
使用一个参数调用User类,并在初始化内部调用具有相同参数bcs的父类。你像这样使用super
。
如果你致电super()
你不发送参数bcs,你可以调用父初始方法,没有参数。
class Man
attr_accessor :name
def initialize(name = "Foo")
@name = name
end
end
class User < Man
attr_accessor :mail
def initialize(mail = "bar")
super()
@mail = mail
end
end
Man.new
# => #<Man:0x52a7e380 @name="Foo">
User.new
# => #<User:0x11777eb0 @mail="bar", @name="Foo">
答案 3 :(得分:0)
试试这个,它会对你有用:
class Man
attr_accessor :name
def initialize(name = "Foo")
@name = name
end
end
class User < Man
attr_accessor :mail
def initialize(mail = "bar")
super()
@mail = mail
end
end
man = Man.new
puts man.name #> Foo
user = User.new
puts user.name #> Foo
答案 4 :(得分:0)
super without arguments,用它自己调用的相同参数调用超类的初始值设定项。你可以看到,因为name与mail有相同的价值。
您想要做的是:
ButtonMenuHighlightText
通过使用括号,可以使用其他初始值设定项的默认值。