Ruby에서 모듈 변수 만들기


111

Ruby의 모듈에서 클래스 변수와 유사하게 작동하는 변수를 만드는 방법이 있습니까? 이것이 의미하는 바는 모듈의 인스턴스를 초기화하지 않고도 액세스 할 수 있지만 변경할 수 있다는 것입니다 (모듈의 상수와 달리).

답변:


158

Ruby는 기본적으로 모듈에서 클래스 변수를 지원하므로 일부 프록시 또는 의사 클래스 변수가 아닌 클래스 변수를 직접 사용할 수 있습니다.

module Site
  @@name = "StackOverflow"

  def self.setName(value)
    @@name = value
  end

  def self.name
    @@name
  end
end

Site.name            # => "StackOverflow"
Site.setName("Test")
Site.name            # => "Test"

5
+1 사실 '클래스 변수'라는 용어가 오해의 소지가 있다고 생각하고 있습니다. 클래스는 모듈의 특수한 경우이며 클래스 변수는 모듈에서 정의 할 수 있습니다. 모듈 변수라고해야합니다.
sawa apr

3
@sawa : 다소 오해의 소지가 있지만 Ruby 자체에서 사용하는 것 defined?(@@foo) => "class variable"입니다..
Andrew Grimm

1
또는 정적 필드라고 할 수 있습니다. 그것이 그들이 무엇인지 보인다.
Peter Ajtai

@coreyward 안녕 내 실수. 두 개의 '@@'클래스 변수가 필요한 이유는 무엇입니까? 특히 클래스가 클래스 변수를 사용하도록 확장 된 경우 코드 냄새로 간주되지 않습니까? 나는 이것을 테스트하고 있었고 단일 @인스턴스 변수 에서 동일한 결과를 얻을 수 있음을 깨달았습니다 . 클래스 변수를 사용하는 특별한 이유가 있습니까? 답장을 보내 주셔서 감사합니다.
fabbb 2014 년

2
왜 마지막에 다른 호출 : T.get그리고 T::get?
intrixius 2014-08-05

31

인스턴스 내에서 호출 할 필요가없는 경우 모듈 본문 내에서 인스턴스 변수를 사용하면됩니다.

module SomeModule
  module_function
  def param; @param end
  def param= v; @param = v end
end

SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1

@param그런 다음 인스턴스 변수 는 클래스 SomeModule의 인스턴스 인 module에 속합니다 Module.


23

모듈에서 클래스 인스턴스 변수를 설정할 수 있습니다.

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

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

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

+1하지만 클래스 인스턴스 변수가 클래스 변수와 다르다는 점을 강조하겠습니다.
Andrew Grimm 2012 년

4
그래 완전히 .. 그리고 btw .. 나는 클래스 변수를 전혀 사용하지 않는 것이 좋습니다 .. 사용할 때 예기치 않은 일이 발생합니다 ..이 기사를 확인하여 몇 가지 예를 확인하십시오. oreillynet.com/ruby/blog/2007/01/…
Orlando

8

모듈 정의 내에서 값을 초기화 할 수도 있습니다.

module MyModule
  class << self
    attr_accessor :my_variable
  end
  self.my_variable = 2 + 2
end

p MyModule.my_variable
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.