OpenStruct#属性来自哪里?或者我如何找到方法的添加位置?

时间:2017-02-28 07:44:51

标签: ruby

我有一个包含activerecord的gemfile,因此我有.attributes我可以调用我的模型实例将它们转换为哈希。

通过我的代码混合,我最终将OpenStruct而不是模型传递给我的一个方法,并得到了一个难以发现的bug。原因是OpenStruct#属性返回nil(并没有抛出错误,这会提醒我这个问题)。

我不知道如何定义OpenStruct#属性。

  

[2] pry(main)> show-source OpenStruct#attributes

     

错误:找不到OpenStruct#attributes的定义!

...

  

(byebug)OpenStruct.new.method(:attributes)

     

*** NameError异常:类'OpenStruct'的未定义方法'attributes'

...

  

(byebug)OpenStruct.new.attributes

     

如何找到此方法的源代码以及如何将其包含在内?

我有一种预感,就是在某处丢失了方法,这就是为什么它很难追查。但这样做有可能吗?

3 个答案:

答案 0 :(得分:3)

如果你无法通过#method获取它,那就是#method_missing。这是一种与其他方法一样的方法,因此您可以以相同的方式找到源:

OpenStruct.instance_method(:method_missing).source_location
  # => ["/Users/wink/.rbenv/versions/2.3.3/lib/ruby/2.3.0/ostruct.rb", 189]

Link to Github

答案 1 :(得分:3)

要清除一点,它不是一种新方法(尽管它表现得像一种方法)。

在我检查过的ruby 2.4中,method_missing中的ostruct.rb处理调用attr=attr而没有定义新方法。有些类在第一次使用时会定义方法,但OpenStruct不是其中之一。

答案 2 :(得分:1)

方法attributes未在OpenStruct上定义,只是method_missing的工作方式。