2016-07-28 25 views
0

、私は次のような構造別のクラスのメソッドを別のクラスから呼び出す方法は?

class A 
     def method1 
     end 
end 

class B 
     @my = A.new 
     def classATest 
      @myT.method1 
     end 

     def newTest 
      classATest 
     end 
end 

class C 
     newB = B.new 
     newB.newTest 
end 

を持って、私はクラスCを実行すると、それはクラスA(メソッドnewtestの法1を見つけることができないことを私にエラーを与えて、グローバル変数を使用して法1を呼び出す方法classATestは、呼び出します。私は間違って何をやっている?@my = A.newを言い、この許可されていない?

+0

Rubyの規則の1つは、メソッドや変数の名前に* snake-case *を使用することです。これは 'new_test'と' class_a_test'(あるいはおそらく 'classA_test')を書くことを意味します。あなたはそれをする必要はありませんが、私たちの99%+はそうします。あなたは時間があるときに[Ruby Style Guide](https://github.com/styleguide/ruby/)を見たいかもしれません。 –

答えて

2

あなたの行は、それは新しいオブジェクトを作り、クラス Bのインスタンス変数としてそれを割り当てています。便利な何もしていないが、変数のようなものはできないです余分な労力をかけずにBのインスタンスで使用することができます。その行は、

def initialize 
    @myT = A.new 
end 

また、あなたは、ある場所に@myと別の場所に@myTと書きました。

@myTの代わりに、コードをそのまま使用して、などの定数の名前に置き換えてください。 Rubyの定数は大文字で始まり、この変数を使用しようとする方法で使用できます。

+0

"余分な努力"は、def newTestです。 self.class.instance_variable_get(:@ my).send:method1; end'。クラスインスタンス変数 '@ a'とインスタンス変数' @a 'は、夜と日とで異なっています。名前が '@a'と' @b'であれば変わりません。 'method1'はnilを返すので、戻り値は' nil'です。 'method1'を' def method1 'に変更した場合、 'こんにちは';終了」、「ハイ」が返される。 –

+0

...しかし、しかし、私はそれをテストしました。 –

+0

おっと、私は以前のコメントを撤回します。私が実際に意味することは、 'method1'がpublicであるので、' send'の呼び出しは不要であるということです。ある時点では、 'instance_variable_get'がプライベートなので' send'が必要でした。 –

関連する問題