IT TIP

Ruby에서 모듈의 인스턴스 변수를 초기화하려면 어떻게해야합니까?

itqueen 2020. 10. 14. 21:30
반응형

Ruby에서 모듈의 인스턴스 변수를 초기화하려면 어떻게해야합니까?


인스턴스 변수를 사용하고 싶은 모듈이 있습니다. 현재 다음과 같이 초기화하고 있습니다.

module MyModule
  def self.method_a(param)
    @var ||= 0
    # other logic goes here
  end
end

초기화하기 위해 init 메서드를 호출 할 수도 있습니다.

def init
  @var = 0
end

그러나 이것은 항상 그것을 부르는 것을 기억해야한다는 것을 의미합니다.

이 작업을 수행하는 더 좋은 방법이 있습니까?


모듈 정의에서 초기화하십시오.

module MyModule
  # self here is MyModule
  @species = "frog"
  @color = "red polka-dotted"
  @log = []

  def self.log(msg)
    # self here is still MyModule, so the instance variables are still available
    @log << msg
  end
  def self.show_log
    puts @log.map { |m| "A #@color #@species says #{m.inspect}" }
  end
end

MyModule.log "I like cheese."
MyModule.log "There's no mop!"
MyModule.show_log #=> A red polka-dotted frog says "I like cheese."
                  #   A red polka-dotted frog says "There's no mop!"

모듈이 정의 될 때 인스턴스 변수를 설정합니다. 나중에 alwasys가 모듈을 다시 열어 인스턴스 변수와 메서드 정의를 더 추가하거나 기존 변수를 재정의 할 수 있습니다.

# continued from above...
module MyModule
  @verb = "shouts"
  def self.show_log
    puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" }
  end
end
MyModule.log "What's going on?"
MyModule.show_log #=> A red polka-dotted frog shouts "I like cheese."
                  #   A red polka-dotted frog shouts "There's no mop!"
                  #   A red polka-dotted frog shouts "What's going on?"

당신이 사용할 수있는:

def init(var=0)
 @var = var
end

그리고 아무것도 전달하지 않으면 기본값은 0입니다.

매번 호출 할 필요가 없다면 다음과 같이 사용할 수 있습니다.

module AppConfiguration
   mattr_accessor :google_api_key
   self.google_api_key = "123456789"
...

end

클래스의 경우, 클래스의 새 인스턴스를 .new 할 때마다 초기화가 호출되기 때문에 다음과 같이 말할 것입니다.

def initialize
   @var = 0
end

from Practical Ruby:

It goes on to say that a module's initialize will be called if an including class's initialize calls super, but doesn't mention that this is a consequence of how super works everywhere, not special handling for initialize. (Why might one assume initialize gets special handling? Because it gets special handling with respect to visibility. Special cases create confusion.)


i answered a similar question, you can set class instance variables doing this

module MyModule
  class << self; attr_accessor :var; end
end

MyModule.var
=> nil

MyModule.var = 'this is saved at @var'
=> "this is saved at @var"

MyModule.var    
=> "this is saved at @var"

Apparently it's bad form to initialise instance variables in a module in Ruby. (For reasons I don't fully understand, but pertaining to the order in which things are instantiated.)

It seems that best practice is to use accessors with lazy initialisation, like so:

module MyModule
  def var
    @var ||= 0 
  end
end

Then use var as the getter for @var.

참고URL : https://stackoverflow.com/questions/698300/how-can-i-initialize-a-modules-instance-variables-in-ruby

반응형