2014-11-19 2 views
1

예 :루비 클래스 변수를 동적으로 추가

class Base 
    @@var = "base" 

    def self.assign_var(var) 
    @@var = var 
    end 

    def self.show_var 
    @@var 
    end 

    def initialize 
    p @@var 
    end 

end 

class A < Base 
    assign_var("a") 
end 

class B < Base 
    assign_var("b") 
end 

class C < Base 
    assign_var("c") 
end 

p A.show_var # "c" 
p B.show_var # "c" 
p C.show_var # "c" 
a = A.new # "c" 
b = B.new # "c" 
c = C.new # "c" 

어떻게 자신의 가치는 자신의 클래스에 할당 보여주기 위해 만드는? 같은 :

p A.show_var # "a" 
p B.show_var # "b" 
p C.show_var # "c" 
a = A.new # "a" 
b = B.new # "b" 
c = C.new # "c" 

UPDATE

나는 이니셜이 var에 액세스해야합니다.

class Base 
    @var = "base" 

    def self.assign_var(var) 
    @var = var 
    end 

    def self.show_var 
    @var 
    end 

    def initialize 
    p @var 
    end 
end 

class A < Base 
    assign_var("a") 
end 

class B < Base 
    assign_var("b") 
end 

class C < Base 
    assign_var("c") 
end 

p A.show_var # "a" 
p B.show_var # "b" 
p C.show_var # "c" 
a = A.new # nil 
b = B.new # nil 
c = C.new # nil 

내가 Vu의 솔루션을 사용하는 경우 작동하지 않습니다 ... 어떤 아이디어입니까?

답변

4

클래스 변수는 서브 클래스에서 재정의되지 않습니다. 이 경우 클래스 수준의 인스턴스 변수를 사용할 수 있습니다

class Base 
    @var = "base" 

    def self.assign_var(var) 
    @var = var 
    end 

    def self.show_var 
    @var 
    end 
end 

class A < Base 
    assign_var("a") 
end 

class B < Base 
    assign_var("b") 
end 

class C < Base 
    assign_var("c") 
end 

p A.show_var # "a" 
p B.show_var # "b" 
p C.show_var # "c" 

자세한 내용은 다음을 http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

+1

일부 문서는 클래스 변수 ('@@') 클래스 * 계층 구조 * 변수. 나는 클래스 계층 변수를 사용할 때 좋은 예를 보지 못했다. IMO의 경험 법칙은 : 사용하지 마십시오. – spickermann

2

는 @ 데자뷰의 대답에 확장 된 주석으로 다음과 같은 처리하시기 바랍니다. 그는 좋은 답변을 주었지만 (+1) 의도적으로 OP 코드에 가깝게 유지했습니다. 이 작업을 수행하는 일반적인 방법은 클래스 인스턴스 변수 (Vu가 수행 한대로)와 해당 변수에 대한 접근자를 사용하는 것입니다.

class Base 
    @var = "base" 
    class << self 
    attr_accessor :var 
    end 
end 

class A < Base 
    @var = "a" 
end 

class B < Base 
    self.var = "b" 
end 

Base.methods(false)  #=> [:var, :var=] 
A.methods(false)   #=> [] 
A.methods.include?(:var) #=> true 
A.method(:var=)   #=> #<Method: A(Base) 
A.method(:var).owner  #=> #<Class:Base> 

Base.instance_variables #=> [:@var] 
A.instance_variables  #=> [:@var] 

Base.var #=> "base" 
A.var #=> "a" 
B.var #=> "b" 
Base.var = 'cat' 
Base.var #=> "cat" 
A.var #=> "a" 
관련 문제