В моей разработке игр есть класс Point
(хранится x
, y
координаты и другие полезные вещи). Мои игровые объекты имеют свойство @position
, которое является экземпляром Point
. Когда изменяется @position
, игровой объект будет нарисован где-то в другом месте.Могу ли я переопределить поведение оператора присваивания?
Моя проблема заключается в следующем:
@someSprite.position = Point.new(100,100)
temp = @someSprite.position
temp.x = 500
temp
становится отнесение @someSprite.position
. Изменение его также изменило бы положение спрайта. Этого я не хочу. Я хочу, чтобы temp
был другим экземпляром.
Я не могу сделать что-то вроде этого:
temp = @someSprite.position.clone
из другой детали в рамках: Point
является observable. @someSprite
наблюдает за собой, @someSprite.position
.
Если я использую clone
, то temp
также клонирует реестр наблюдателей. И когда будет изменено состояние temp
, @someSprite
будет уведомлено, создавая беспорядок.
Можно сделать это, то:
temp = @someSprite.position.clone
temp.remove_observer(@someSprite)
Но что чувствует непрактичным и хак.
Другой подход:
temp = Point.new(@someSprite.position)
где я сделать конструктор для Point
, где он принимает значение от другого Point
(без копирования реестра наблюдателя). Это похоже на лучший подход до сих пор, но я хочу достичь этого
temp = @someSprite.position
Это можно сделать? Могу ли я переопределить поведение оператора присваивания в этом случае?
Оператор присваивания * никогда не переопределяется в Ruby. Сети - сеттеры; даже скрываясь за сахаром, которые заставляют их использовать оператор присваивания (они действительно не так, как вызовы сеттера действительно отправляются сообщениями). – user2246674
@ user2246674: Как насчет предлагать практическое решение вместо того, чтобы быть грубым? – Borodin
@ user2246674: Не могли бы вы расширить свою идею изменчивости в ответ? Мне любопытно, но, честно говоря, мне все еще не хватает предложения. – Voldemort