2017-12-21 5 views
-1

클래스간에 변수를 전달할 수있는 방법이 있습니까? 다음 코드가 있습니다.Ruby 클래스가 변수를 전달합니다

module Test 
    class Super 
    def initialize(name) 
     @name = name 
    end 
    end 

    class Upper 
    def test 
     puts @name 
    end 
    end 
end 

a=Test::Super.new('My name') 
b=Test::Upper.new() 
b.test() 

감사합니다!

+2

어떤 변수 당신은 무엇 클래스 사이에 공유 할 수 있습니까? – sawa

+0

다른 'Test :: Super' 인스턴스가있는 경우 (예 : 'a2 = Test :: Super.new ('My other name')','b.test()'는 무엇을 반환할까요? – Stefan

답변

1

아니요, a는 인스턴스입니다. 당신을위한 2 개의 응답;

1) ab으로 전송하는 것이 더 좋습니다. 그래서 당신은 이런 것을 할 것입니다.

class Upper 
    def test(s) 
    s.name 
    end 
end 

a = Test::Super.new('My Name') 
u = Test::Upper.new 
u.test(a) 

(attr_reader :name 가정) 또는 당신이 그것을 설정의 일부를 가질 수있다; 나는 당신에게 모든 코드를 제공하지만, 여기가

a = Test::Super.new('My name') 
b = Test::Upper.new(a) 
b.test 
=> 'My name' 

어느 쪽이 예제의

클래스에 특히 좋습니다보고 싶은데 방법하지만 난 당신이 당신이 달성하기 위해 노력하고보다 구체적인 사용 사례가 상상하지 않습니다 이 질문의 목적을 위해 익명으로 처리 된 :

+0

또한 예약 된 루비 단어이기 때문에'Super'를 피하십시오 – court3nay

+1

'Super'는 예약 된 루비 단어가 아닙니다. Ruby는 대소 문자를 구분합니다. – mudasobwa

+1

동의하지만,'super = Test :: Super와 같은 것을 할 때까지 기다려라.새로운 '과 그것이 왜 작동하지 않는지 궁금해. :) – court3nay

-1

클래스 변수는 모듈에서 사용할 수 있습니다.이 클래스는 Ruby에서 기본적으로 지원합니다.

당신은 할 수 있습니다 :

module Test 

    @@name = '' 

    class Super 
    def initialize(name) 
     @@name = name 
    end 
    end 

    class Upper 
    def test 
     puts @@name 
    end 
    end 
end 

a=Test::Super.new('My name') 
b=Test::Upper.new() 
b.test() 
+1

루비에서 클래스 변수를 사용해서는 절대로 제안하지 마십시오. ** 아무런 가치도없는 ** 많은 단점이 있습니다. 하나는'Test'의 클래스 레벨에서 인스턴스 변수를 더 잘 사용해야합니다. 또한,'@@ name'의 void 선언은 의미가 없습니다. – mudasobwa

1

클래스 Super의 인스턴스의 내부에 액세스 할 수있는 클래스 Upper 필요 어떤 이유로 인스턴스를 들어, 당신이 설계 결함을 의미합니다.

한 가지 가능한 방법은 Super 필요가 게터를 통해 변수에 노출 될 것이다 :

module Test 
    class Super 
    def initialize(name) 
     @name = name 
    end 
    def name 
     @name 
    end 
    end 
end 

지금 당신이 Test::Super.new("my name").name으로 name을 얻을 수 있습니다. UpperSuper에서 이행을 유도하기 때문에,

class Upper < Super 
    def test 
    puts @name 
    end 
end 

지금 Test::Upper.new("my name").test"my name"을 인쇄합니다 :


또 다른 가능성은 Upper 실제로 Super의 서브 클래스입니다. 또한


, 하나는 바깥 쪽 모듈 수준에서 인스턴스 변수를 사용할 수 있습니다 :

module Test 
    def self.name=(name) 
    @name = name 
    end 
    def self.name 
    @name 
    end 

    class Super 
    def initialize(name) 
     Test.name = name 
    end 
    end 

    class Upper 
    def test 
     puts Test.name 
    end 
    end 
end 

이 인쇄 것입니다 :

▶ Test::Super.new("my") 
#⇒ #<Test::Super:0x0055dae57fe390> 
▶ Test::Upper.new.test 
#⇒ "my" 
관련 문제