在Rails中编写可继承的属性与基本赋值

Kev*_*tre 7 ruby ruby-on-rails

只是好奇Rails gem中这两者之间的区别:

write_inheritable_attribute(:sample, "sample")
self.sample = "sample"
Run Code Online (Sandbox Code Playgroud)

我找不到任何好的文档write_inheritable_attribute,只是阅读一些宝石源,发现前者使用了几次.谢谢!

Jos*_*uez 13

子类不继承实例变量:

>> class B ; @candy = 1 ; end
>> B.instance_variable_get :@candy          # => 1
>> class C < B ; end
>> C.instance_variable_get :@candy          # => nil
Run Code Online (Sandbox Code Playgroud)

在rails中,可继承属性提供了一个解决方案:

>> class B ; end
>> B.write_inheritable_attribute(:candy, 7) # => 7
>> class C < B ; end
>> C.read_inheritable_attribute(:candy)     # => 7
Run Code Online (Sandbox Code Playgroud)


bow*_*ior 5

对于一个简单的类或模块,没有区别,但是对于可以加载多个其他模块的更复杂的模块,类似的方法write_inheritable_attribute可以帮助您轻松可靠地修改对象,而不必担心范围,私有/受保护的方法以及来自红宝石元编程魔法的各种干扰method_missing.

简而言之,当您编写时foo.sample = "sample",可能会在设置属性之前,之后或之后发生各种事情,尤其是在对象使用ActiveModel或ORM时.当你使用时,foo.write_inheritable_attribute(:sample, "sample")你可以更好地控制发生的事情.

  • 除非你得到很多背景知识,否则很难解释一些ruby的高级功能.我强烈推荐使用"Metaprogramming Ruby"这本书,对这些功能进行了很好的解释:http://pragprog.com/titles/ppmetr/metaprogramming-ruby (2认同)