2016-07-28 3 views
0

I имеют следующую структуруКак вызвать другие методы классов из другого класса?

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, он дает мне ошибку, что она не может найти method1 класса А (метод newtest, вызывает метод classATest, который вызывает method1, используя глобальную переменную. что я делаю неправильно? Разве это не разрешено?

+0

Один из конвенций Ruby заключается в том, чтобы использовать * snake-case * для имен методов и переменных, то есть вы могли бы написать 'new_test' и' class_a_test' (или, возможно, 'classA_test'). Вам не обязательно это делать, но 99% + мы делаем. Возможно, вам захочется взглянуть на [Руководство по стилю Ruby] (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; конец'. Переменная экземпляра класса '@ a' и переменная экземпляра' @ a' отличаются от ночи и дня. Не было бы иначе, если бы они были названы '@ a' и' @ b'. Возвращаемое значение равно 'nil', потому что' method1' возвращает nil. Если вы изменили 'method1' на' def method1; 'Здравствуй'; end', ''hi'' будет возвращен. –

+0

... но, но, но, я проверил его. –

+0

К сожалению, я убираю свой предыдущий комментарий. Я действительно имею в виду, что вызов 'send' не нужен, поскольку' method1' является общедоступным. В какой-то момент вам понадобилось 'send', потому что' instance_variable_get' был закрытым. –