不了解类,模块和类<< self方法

Nat*_*han 8 ruby ruby-on-rails

我有以下代码:

class MyClass  
  module MyModule
    class << self

      attr_accessor :first_name

      def myfunction
        MyModule.first_name = "Nathan"
      end

    end
  end
end
Run Code Online (Sandbox Code Playgroud)

当我这样调用方法时myfunction,它工作正常:

> me = MyClass::MyModule.myfunction
=> "Nathan"
> me
=> "Nathan"
Run Code Online (Sandbox Code Playgroud)

但是,如果我删除class << self并添加self.前缀myfunction,它不起作用.

例如:

class MyClass  
  module MyModule

    attr_accessor :first_name

    def self.myfunction
      MyModule.first_name = "Nathan"
    end

  end
end


> me = MyClass::MyModule.myfunction
NoMethodError: undefined method `first_name=' for MyClass::MyModule:Module
Run Code Online (Sandbox Code Playgroud)

我正在尝试理解这种class << self方法.我认为这是一种self.方法,为它内部的所有方法添加前缀,但如果这是真的,为什么不删除它并self.手动为每个方法添加前缀?

在此先感谢您的帮助.

jne*_*son 7

这是因为你attr_accessor :first_name的包裹也是class << self.

要按照你的建议去做,你可以mattr_accessor像这样使用:

require 'active_support'

class MyClass  
  module MyModule

    mattr_accessor :first_name

    def self.myfunction
      MyModule.first_name = "Nathan"
    end

  end
end
Run Code Online (Sandbox Code Playgroud)