我有两个文件,一个带有模块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
Run Code Online (Sandbox Code Playgroud)
我想混合到TestInclude另一个文件中的类:
class TestInclude
require "ToMixFile"
include ToMix
end
Run Code Online (Sandbox Code Playgroud)
有人能解释为什么实例变量@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
Run Code Online (Sandbox Code Playgroud)
模块为事物添加功能;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
Run Code Online (Sandbox Code Playgroud)
尤其,
"".extend(ToMix).mixed_var == nil # no error, but no value, interesting!
Run Code Online (Sandbox Code Playgroud)
但
(a = "".extend(ToMix)).mixed_var = "interesting"
a.mixed_var == "interesting"
Run Code Online (Sandbox Code Playgroud)
和
ToMix.module_function == "module_var"
Run Code Online (Sandbox Code Playgroud)
/sf/answers/10624211/ http://www.natontesting.com/2009/09/28/accessing-instance-variables-declared-in-ruby-modules/ 如何动态更改 Ruby 中的继承
编辑:如果我错了,那些比我聪明的人应该纠正我,但模块和类定义本身就是对象。@var因此,在模块定义中定义 a会将 var 添加到模块对象本身
编辑:那些比我聪明的人纠正了我:虽然类和模块定义的行为有点像单例,但它们本身并不是对象。您可以将方法def self.bacon和@var外部视为 C++ 静态方法和变量,但它们只能像静态一样进行访问,即使您在实例中也是如此。