В определении класса, в чем разница между этими двумя методами?В чем разница между def func (var) и def func = (var)?
def func(var)
...
end
def func=(var)
...
end
Есть ли какие-либо из них, или один из них недействителен?
В определении класса, в чем разница между этими двумя методами?В чем разница между def func (var) и def func = (var)?
def func(var)
...
end
def func=(var)
...
end
Есть ли какие-либо из них, или один из них недействителен?
Чтобы объяснить некоторые вещи, о чтения/записи методы 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)
.
Оба они являются действительными определениями методов. Но второй один является определение метода «сеттер» - вы можете вызвать этот метод со следующим синтаксисом:
obj.func = 123
Это заявление будет переведено на
obj.func=(123)
Вы можете посмотреть на this answer где можно Я объясняю этот синтаксис чуть более подробно.
Благодарим за разъяснение :) –
Либо может быть сеттер, это действительно зависит от того, для чего вы используете значение. Использование '=' позволяет нам соответствовать нашей идее о том, как должно выглядеть присваивание, но это действительно обледенение на торте. Другие стили программирования для других языков будут искать наличие параметра для определения того, является ли он сеттер против геттера. –
@ The Tin Man: Так что = можно опустить? Он говорит то же самое без =? –
Они определяют методы 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!
И спасибо за еще один отличный пример использования! –
Добро пожаловать @Roger. Ruby имеет один из лучших синтаксисов по сравнению с большинством языков :) – Anurag
ОК, теперь я получил его ... большое спасибо за объяснение: D –
@RogerNordqvist, без проблем. Он бросил меня за цикл, когда я узнал Ruby, потому что я пришел с других языков, которые были не такими гибкими. –