`argument'在`super(argument)中做了什么?

时间:2016-01-11 21:25:40

标签: ruby arguments super

我有以下代码:

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.gearst.wheels按预期返回nil

但是,无论我运行super(gears)还是super,代码都会返回相同的结果。 argument中的super(argument)做了什么?在我输入super(argument)super时会有什么不同?

2 个答案:

答案 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)将覆盖当前方法参数。