我有以下代码:
class Bicycle
attr_reader :gears, :wheels, :seats
def initialize(gears = 1, wheels = 2)
@gears = gears
@wheels = wheels
@seats = 1
end
end
b = Bicycle.new
b.gears # => 1
b.wheels # => 2
b.seats # => 1
class Tandem < Bicycle
def initialize(gears)
super(gears)
@seats = 2
end
end
t = Tandem.new(2)
t.gears # => 2
t.wheels # => 2
t.seats # => 2
当我删除super
时,t.gears
和t.wheels
按预期返回nil
。
但是,无论我运行super(gears)
还是super
,代码都会返回相同的结果。 argument
中的super(argument)
做了什么?在我输入super(argument)
或super
时会有什么不同?
答案 0 :(得分:4)
实际上,此问题的评论不正确。以下是super
所做的准确描述。
如果使用参数调用(如上所述),它会将这些参数传递给父类中的重写方法,而不管传递给子类中重写方法的参数如何。例如:
class Parent
def test(*args)
puts "Args: #{args}"
end
end
class Child < Parent
def test(*args)
super('hello')
end
end
Child.new.test
'Args: [hello]'
=> ...
如果在没有任何参数的情况下调用super
,则会从子方法隐式传递参数。例如:
class Parent
def test(*args)
puts "Args: #{args}"
end
end
class Child < Parent
def test(*args)
super
end
end
Child.new.test('arg1', 'arg2')
'Args: [arg1, arg2]'
=> ...
希望能够解决它!
答案 1 :(得分:1)
super只会将当前方法的参数发送到父方法。
发送到父方法时,super(arg1,arg2)将覆盖当前方法参数。