Привет, дорогие stackoverflowers :)
Я пришел из Java и имею одно сомнение относительно синтаксиса геттеров (если это действительно просто проблема синтаксиса).
В java у вас будет сеттер вроде
private void setName(value) {
variableName = value;
}
который возьмет значение в качестве аргумента и изменит переменную экземпляра внутри нее.
В рубине, когда я явно определяю сеттер (из-за ограничений), мне нужно использовать set_name = (значение), или если я использую синтаксис set_name (значение), будет таким же? Другими словами, = в конце имени метода делает что-то еще или просто синтаксис (например, и?).
Как это:
def set_name=(value)
@name = value
end
Или это:
def set_name(value)
@name = value
end
Заранее благодарим за внимание.
Alex
Трейлинг =
в имени метода идентифицирует метод как метод setter/mutator. Когда вы говорите это в Ruby:
o.p = v
Вы действительно говорите:
o.send(:p=, v)
поэтому op = v
является просто причудливым способом вызова метода p=
в o
. Вот почему такие вещи:
's'.pancakes = 11
дает вам исключение NoMethodError
которое жалуется на 's'
не имеющий метода pancakes=
Строки" (к сожалению) не имеют методов pancakes=
.
В вашем случае вы не set_name
использовать set_name
вообще, у вас будет метод name=
:
def name=(value)
@name = value
end
и, возможно, метод name
в качестве accessor/getter:
def name
@name
end
Самый идиоматический подход в Ruby - это сделать
def name=(value)
@name = value
end
или еще лучше,
attr_writer :name
Мне нужно использовать set_name = (значение), или если я использую синтаксис set_name (значение), будет таким же?
class Dog
attr_reader :name
def initialize(name)
@name = name
end
def name1=(str)
@name = str
end
def name2(str)
@name = str
end
end
d = Dog.new("Rover")
puts d.name #=>Rover
d.name1 = "Ruthie"
puts d.name #=>Ruthie
d.name2("John")
puts d.name #=>John
d.name2 = "Roger"
--output:--
1.rb:23:in '<main>': undefined method 'name2=' for #<Dog:0x00000100907030 @name="John"> (NoMethodError)
Для сеттеров имя метода включает знак "=". Но ruby также позволяет использовать синтаксический сахар с именами методов, которые заканчиваются на '=':
obj.setter_name = value
эквивалентно:
obj.setter_name=(value)