笔记:Ruby的super

Ruby super语法

super

Examples:

	super
	super(1,2,3)

Syntax:

	super
	super(expr,...)

the super invokes the method which the current method overrides. If no arguments given, arguments to the current method passed to the method. 

感觉解释的不太清楚。

其实ruby里面的super行为特别简单。

# super调用意味着,调用 父类同名方法。明确参数即传递书写的参数
super( ... )

# 无参数,会把当前方法参数默认传递给 父类同名函数

super


实验

1.对比 initialize 方法

调用且传参数结果, 参数以字面量书写为准。

class A
  def initialize(*args)
    puts '---A initialize----'
    puts args
  end
end

class B < A

  def initialize(*args)
    puts '---B initialize---'
    puts args
    super(address: 'earth')
  end
end


b = B.new( name: 'tom', age: '18')


#ouput>>>>>>>>>>

# ---B initialize---
# {:name=>"tom", :age=>"18"}
# ---A initialize----
# {:address=>"earth"}

2.调用且不传参数

不传参数则转发当前函数的参数。

class A
  def initialize(*args)
    puts '---A initialize----'
    puts args
  end
end

class B < A

  def initialize(*args)
    puts '---B initialize---'
    puts args
    super
  end
end


b = B.new( name: 'tom', age: '18')


#output>>>>>>

# ---B initialize---
# {:name=>"tom", :age=>"18"}
# ---A initialize----
# {:name=>"tom", :age=>"18"}

3.其他方法表现也一样毫无差别

这里可能会比其他语言灵活。其他语言可能没有这样玩super的。 一般都限定在 init 周期。


class A
  def initialize(*args)
    puts '---A initialize----'
    puts args
  end

  def run(*args)
    puts '---A run----'
    puts args
  end
end

class B < A

  def initialize(*args)
    puts '---B initialize---'
    puts args
  end

  def run(*args)
    puts '---B run----'
    puts args
    super
  end
end


b = B.new( name: 'tom', age: '18')

b.run(name: 'run', age: '18')

#output>>>>>

# ---B initialize---
# {:name=>"tom", :age=>"18"}
# ---B run----
# {:name=>"run", :age=>"18"}
# ---A run----
# {:name=>"run", :age=>"18"}

总结

super就像一个约定名字,可以自由调用父类同名方法,就是这样。

还提供一个便利——不加参数即自动转发当前函数参数。

Mark24

Everything can Mix.