加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby,mixin实例变量和方法

发布时间:2020-12-17 02:21:19 所属栏目:百科 来源:网络整理
导读:我有两个文件,一个带有模块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 d
我有两个文件,一个带有模块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
http://www.natontesting.com/2009/09/28/accessing-instance-variables-declared-in-ruby-modules/
How to dynamically alter inheritance in Ruby

编辑:如果我错了,那些比我更聪明的人应该纠正我,但模块和类定义本身就是对象.因此,在模块定义中定义@var会将var添加到模块对象本身

编辑:那些比我更纠正的人更聪明:虽然类和模块定义的行为类似于单例,但它们本身并不是对象.您可以将def self.bacon和@var之外的方法视为c静态方法和变量,但它们可以/仅/可以像静态一样访问,即使您在实例中也是如此.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读