Ruby,mixin实例变量和方法
我有两个文件,一个带有模块ToMix:
module ToMix @module_var = "modulevar" def self.mix_function puts "mix_function SELF: #{@module_var}" end def mix_function puts "mix_function: #{@module_var}" end class MixClass attr_accessor :mixclassvar def initialize(value) @mixclassvar = value end end end 我想混合到另一个文件中的类TestInclude: class TestInclude require "ToMixFile" include ToMix end 有人可以解释为什么实例变量@module_var和方法self.mix_function,mix_function是未定义的?我将如何定义它们? t2 = TestInclude.new() t2.mix_function # => error undefined (exected call to mix_function) t2.module_var = "test set module_var" # => error undefined TestInclude.mix_function # => error undefined (expected call to self.mix_function) TestInclude.method_defined? :mix_function # => false 解决方法
模块为事物添加功能; attr_accessor添加了与变量交互的函数.
module ToMix @module_var = "module_var" attr_accessor :mixed_var def initialize @mixed_var = "mixed_var" end def mix_function puts "mix_function: #{@mixed_var}" end def self.module_function @module_var end end class Mixed include ToMix end Mixed.new.mixed_var 值得注意的是, "".extend(ToMix).mixed_var == nil # no error,but no value,interesting! 但 (a = "".extend(ToMix)).mixed_var = "interesting" a.mixed_var == "interesting" 和 ToMix.module_function == "module_var" https://stackoverflow.com/a/151774/171916 编辑:如果我错了,那些比我更聪明的人应该纠正我,但模块和类定义本身就是对象.因此,在模块定义中定义@var会将var添加到模块对象本身 编辑:那些比我更纠正的人更聪明:虽然类和模块定义的行为类似于单例,但它们本身并不是对象.您可以将def self.bacon和@var之外的方法视为c静态方法和变量,但它们可以/仅/可以像静态一样访问,即使您在实例中也是如此. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |