2016-07-28 167 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類,它給我的錯誤,它找不到類的方法1(方法newtest,調用方法classATest,它調用使用全局變量的方法1。我究竟做錯了什麼?這難道不是可以嗎?

+0

Ruby的一個慣例是使用* snake-case *作爲方法和變量的名字,這意味着你可以寫'new_test'和'class_a_test'(或者可能'classA_test')。你不需要那樣做,但我們99%的人都這麼做。當你有一些時間的時候,你可能想看看[Ruby Style Guide](https://github.com/styleguide/ruby/)。 –

回答

2

你行,說@my = A.new沒有做什麼有用的東西。它讓一個新的對象,並作爲 B的實例變量賦值,但該類型的變量不能不需要額外的努力就可以被B的實例使用,你應該用下面的代碼替換該行:

def initialize 
    @myT = A.new 
end 

另外,你有一個錯字:你在一個地方寫了@my,在另一個地方寫了@myT

或者,保留代碼的方式,並用常數名稱替換@my@myT,例如MyA。 Ruby中的常量以大寫字母開頭,可以按照您嘗試使用此變量的方式使用。

+0

「額外的努力」是「def newTest; self.class.instance_variable_get(:@ my).send:method1; end'。類實例變量'@ a'和實例變量'@ a'與日夜不盡相同。如果它們被命名爲「@ a」和「@ b」,它們也不例外。返回值是'nil',因爲'method1'返回nil。如果將'method1'更改爲'def method1; 「喜」;結束','hi''會被退回。 –

+0

...但是,但是,我測試了它。 –

+0

糟糕,我收回了我之前的評論。我真正的意思是,對'send'的調用是不必要的,因爲'method1'是公共的。在某個時間點,你需要'send',因爲'instance_variable_get'是私有的。 –

相關問題