我有一段代码
def data
data_type == 'option' ? options[super.to_i] : super
end
我无法弄清楚super关键字在哪里获得价值。
答案 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会自动将它所调用的方法(在子类中)接收的任何参数传递给超类中的相应方法。
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"]