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
'IT TIP' 카테고리의 다른 글
VueJS의 Angular Service에 해당하는 것은 무엇입니까? (0) | 2020.10.14 |
---|---|
bindActionCreators는 언제 react / redux에서 사용됩니까? (0) | 2020.10.14 |
Python의 스레드 내에서 호출 될 때 sys.exit ()가 종료되지 않는 이유는 무엇입니까? (0) | 2020.10.14 |
자식 클래스의 이름을 모르고 django에서 개체의 자식 클래스에 액세스하려면 어떻게해야합니까? (0) | 2020.10.14 |
gpg 명령 줄을 사용하여 암호가 올바른지 확인하는 방법 (0) | 2020.10.14 |