2012-05-27 2 views
0

Я занимаюсь Ruby (Ruby 1.9.3, IRB 0.9.6 (09.06.30)), и я пытаюсь разработать сложный класс чисел. У меня есть методы initialize и to_s. Теперь я пытаюсь перегрузить четыре арифметических оператора.Ruby access instance variable другого объекта

То, что я должен был следующий:

def +(other) 
    return ComplexNumber.new(@real + [email protected], @imag + [email protected]) 
end 

, но по какой-то причине не нравится [email protected]; он сообщает

syntax error: unexpected tIVAR

и указывает на запятую после [email protected].

Итак, я изменил его:

def get_values 
    return [@real, @imag] 
end 

def +(other) 
    other_values = other.get_values 
    return ComplexNumber.new(@real + other_values[0], @imag + other_values[1]) 
end 

Хотя это работает, у меня есть ощущение, что это не правильный способ сделать это. Я действительно не хочу раскрывать метод get_values; нет ли способа доступа к переменной другого экземпляра того же класса?

+0

Рубин имеет сложный класс из коробки: 'путы«0.3-0.5i» .to_c.class # => Complex' – steenslag

ответ

1

переменные экземпляра доступны без @ при обращении к другому экземпляру:

other.real 

(Предполагая, что вы либо с помощью attr_accessor, чтобы определить их, или предоставляют свои собственные аксессоров Даже в пределах одного экземпляра можно. предпочитают использовать аксессоров в случае, если есть логика за простое возвращение переменной экземпляра.)

+0

Когда я использовал 'other.real', он предположил, что' real' был методом и выбросил ошибку. Что такое 'attr_accessor'? – wchargin

+0

@WChargin http://apidock.com/ruby/Module/attr_accessor Я не знаю, почему вы создали бы сложный класс, не предоставляя аксессуаров для разных частей; в них будут нуждаться все, что угодно, с комплексными числами. –

+0

Хорошо, это имеет смысл. – wchargin

3

лучший способ (на мой взгляд) было бы обеспечить доступ только для чтения к переменным real и imag с помощью attr_reader. Как:

class ComplexNumber 
    attr_reader :imag, :real 
    ... 
    def +(other) 
    return ComplexNumber.new(@real + other.real, @imag + other.imag) 
    end 
end 

Обратите внимание, что attr_reader определяет методы от вашего имени .real() и .imag() [attr_accessor дополнительно определяет .real=() и .image=()]

+0

Итак, четыре метода являются частными, я полагаю? – wchargin

+0

@WChargin Почему вы это предполагаете? –

+0

Потому что есть установленные методы, которые кажутся навязчивыми. Являются ли это только методы set, которые являются частными, а методы get являются общедоступными? – wchargin

Смежные вопросы