这里有超级关键字的用法是什么?

时间:2016-06-14 05:19:29

标签: ruby

我有一段代码

def data
  data_type == 'option' ? options[super.to_i] : super
end

我无法弄清楚super关键字在哪里获得价值。

2 个答案:

答案 0 :(得分:2)

如果data为false,则super关键字调用其父类的相同data_type == 'option'方法。 请查看此链接以获取详细说明。 Super keyword in Ruby

  

更新

上述代码可以重写为

if data_type == 'option'
  options[super.to_i]#options is probably a hash/array here.
else
  super
end

当我们调用super它在执行它的父类的data方法后返回一个值,让我们假设它返回"5",我们将它转​​换为一个整数并从中获取数据options数组。即,options[5]

在else块中,我们只是返回父级的data方法得到的值。

答案 1 :(得分:2)

如果超类和子类都具有相同名称的方法,则子类的实现将占优势(在子类内)。但是,我们可能需要添加额外的功能,而不是覆盖超类的实现。在子类中使用super关键字允许我们这样做; super调用相应方法的超类实现。换句话说,它允许覆盖方法调用重写方法。

class Zazen
  def meditate
    puts "Practicing Zazen…"
  end
end

class Sitting < Zazen
  def meditate
    puts "Sitting…"
    super # Calls the meditate method implemented in the parent class
    puts "Getting up…"
  end
end

s = Sitting.new
s.meditate
Output:
Sitting…
Practicing Zazen…
Getting up…

请注意,在上面的示例中,如何执行两个meditate方法(在两个类中实现)的语句。

super如何处理参数

关于参数处理,super关键字可以以三种方式运行:

当没有参数调用时,super会自动将它所调用的方法(在子类中)接收的任何参数传递给超类中的相应方法。

class A
  def some_method(*args)
    puts "Received arguments: #{args}"
  end
end

class B < A
  def some_method(*args)
    super
  end
end

b = B.new
b.some_method("foo", "bar")     # Output: Received arguments: ["foo", "bar"]

如果使用空括号(空参数列表)调用,则不会将参数传递给超类中的相应方法,无论调用super的方法(在子类上)是否已接收到任何参数。

class A
  def some_method(*args)
    puts "Received arguments: #{args}"
  end
end

class B < A
  def some_method(*args)
    super()  # Notice the empty parentheses here
  end
end

b = B.new
b.some_method("foo", "bar")     # Output: Received arguments: [ ]

当使用显式参数列表调用时,它会将这些参数发送到超类中的相应方法,无论调用super的方法(在子类上)是否已接收到任何参数。

class A
  def some_method(*args)
    puts "Received arguments: #{args}"
  end
end

class B < A
  def some_method(*args)
    super("baz", "qux")  # Notice that specific arguments were passed here
  end
end

b = B.new
b.some_method("foo", "bar")     # Output: Received arguments: ["baz", "qux"]