serializable_hash super如何获取我的重写方法中定义的选项?

时间:2016-03-30 04:01:17

标签: ruby super

在活动记录模型中,我们会根据我们的需要设置选项后覆盖serializable_hash方法并调用super options

通常我们这样做:

def serializable_hash options=nil
    options ||= {
      only: [
        :id,
        :special_instructions
      ],
      include: { images: nil },
      methods: [:catalog_item_name, ]
    }
    super options
  end

但是在其中一个模型中,我们意外地 明确地将options传递给super方法。尽管如此,它似乎正在起作用,就好像我们正在通过选项一样。

在阅读serializable_hash source code之后,我们似乎无法找到在超级方法中正确初始化选项的任何理由。

有关这种情况的任何提示?

当然,尝试在ruby脚本中重现结构似乎并没有以同样的方式实现。 以下是我们为了尝试而编写的内容:

module MyModule
  def my_module_method options=nil
    options ||= { test: 'Test' }
  end
end

class MyTest
  include MyModule

  def my_module_method
    options = { bingo: 'Bingo!' }
    super
  end
end

puts MyTest.new.my_module_method

这将打印{ test: 'Test' },如果我们通过选项(super options),则会打印{ bingo: 'Bingo!' }(正如我们所料)

1 个答案:

答案 0 :(得分:2)

来自(相当古老)pickaxe book (AKA Programming Ruby)

  

当您在没有参数的情况下调用super时,Ruby会向当前对象的父级发送一条消息,要求它调用与当前方法同名的方法,并将传递给它的参数传递给它。现行方法。

所以给出了这个:

class C
  def m(x)
    puts x
  end
end
class D < C
  def m(x)
    super
  end
end
D.new.m(6)

你会看到6因为x的{​​{1}}参数隐含在D#m中,当你没有为父版本{提供任何显式参数时{1}}。

super定义添加一个参数,你会看到一些东西。