2012-01-18 8 views

ответ

2

Чтобы объяснить некоторые вещи, о чтения/записи методы AKA геттер/сеттер в Ruby:

Рубин не заставляет нас использовать = в определении метода для сеттера. Мы можем выбрать, имеет ли метод один.

Рассмотрим это:

class Foo 

    # automagically creates: 
    # .v 
    # .v= 
    attr_accessor :v 

    def initialize(v) 
    puts "inside initialize(#{ v })" 
    @v = v 
    end 

    def setter(v) 
    puts "inside setter(#{ v })" 
    @v = v 
    end 

    def setter=(v) 
    puts "inside setter=(#{ v })" 
    @v = v 
    end 

end 

f = Foo.new(1) 
puts f.v 

f.setter(2) 
puts f.v 

f.setter = 3 
puts f.v 

f.setter=(4) 
puts f.v 

f.v = 5 
puts f.v 

f.v=(6) 
puts f.v 

Выполнение кода выхода:

inside initialize(1) 
1 
inside setter(2) 
2 
inside setter=(3) 
3 
inside setter=(4) 
4 
5 
6 

= это просто еще одна буква в имени метода, потому что Руби достаточно умен, чтобы знать, если он видит f.setter = 3 он должен использовать метод setter=(v).

Ruby не заставляет использовать = для установки переменной, вы можете решить, имеет ли это смысл для вас при определении метода. Идиоматично, что мы используем =, потому что это помогает сделать сеттер похожим на назначение, устраняя желание назвать все сеттеры чем-то вроде set_v(v).

+0

ОК, теперь я получил его ... большое спасибо за объяснение: D –

+0

@RogerNordqvist, без проблем. Он бросил меня за цикл, когда я узнал Ruby, потому что я пришел с других языков, которые были не такими гибкими. –

6

Оба они являются действительными определениями методов. Но второй один является определение метода «сеттер» - вы можете вызвать этот метод со следующим синтаксисом:

obj.func = 123 

Это заявление будет переведено на

obj.func=(123) 

Вы можете посмотреть на this answer где можно Я объясняю этот синтаксис чуть более подробно.

+0

Благодарим за разъяснение :) –

+0

Либо может быть сеттер, это действительно зависит от того, для чего вы используете значение. Использование '=' позволяет нам соответствовать нашей идее о том, как должно выглядеть присваивание, но это действительно обледенение на торте. Другие стили программирования для других языков будут искать наличие параметра для определения того, является ли он сеттер против геттера. –

+0

@ The Tin Man: Так что = можно опустить? Он говорит то же самое без =? –

1

Они определяют методы getter и setter, если хотите. Скажем, у вас есть класс Person с атрибутом телефона.

class Person 
    def phone 
    @phone 
    end 

    def phone=(number) 
    @phone = number 
    end 
end 

Теперь вы можете изменить атрибут телефона (управляемый внутренне в @phone), просто установив свойство, которое будет вызывать метод phone=.

john = Person.new 
john.phone = "123-456-7890" 

Это похоже на присвоение недвижимости снаружи. Другими символами, которые вы можете складывать в конце имени метода, являются ? для булевых геттеров, ! для деструктивных операций. Опять же, это всего лишь условные обозначения, и вы можете использовать эти три символа, как хотите. Однако код просто выглядит более естественным с этими символами. Например,

question.closed? 
document.destroy! 
+0

И спасибо за еще один отличный пример использования! –

+1

Добро пожаловать @Roger. Ruby имеет один из лучших синтаксисов по сравнению с большинством языков :) – Anurag

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