2017-12-21 11 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( '私の他の名前')'、 '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

ruby​​でクラス変数を使用することは決してお勧めしません。それは価値のない**多くの**欠点を持っています。 'Test'のクラスレベルでインスタンス変数を使うべきです。また、 '@@ name'のvoid宣言も意味をなさない。 – mudasobwa

1

を何らかの理由でクラスUpperのインスタンスがクラスSuperのインスタンスの内部にアクセスする必要がある場合は、それはあなたが設計上の欠陥があることを意味します。

可能な方法の1つは、Superニーズがゲッター経由変数を公開し、次のようになります。

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

は今、あなたはTest::Super.new("my name").namenameを取得する可能性があります。


別の可能性はUpperあり、実際にSuperのサブクラスです:

class Upper < Super 
    def test 
    puts @name 
    end 
end 

UpperSuperから実装を導出するので今Test::Upper.new("my name").testは、"my name"を印刷します。また


、一つは外側のモジュールレベルでインスタンス変数を使用する可能性があります:

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" 
関連する問題