У меня есть внутренний класс случая, в частности событие из this вопроса, и хочет, чтобы соответствовать его, в том числе внешнего объекта:Scala: Как сопоставить шаблон с окружающим объектом внутреннего класса case?
class Player {
var _life = 20
def life = _life
def gainLife(life: Int) = execute(GainLife(life))
case class GainLife(life: Int) extends Event {
def execute() = _life += life
}
}
Я могу легко написать эффект (частичная функцию), которая заменяет жизненные события для конкретный игрок:
//gain twice as much life
def effect(player: Player): ReplacementEffect = {
case player.GainLife(x) => player.GainLife(x * 2)
}
Однако, я не могу сделать то же самое для других игроков. Ближайший я пришел это:
//only you gain life
def effect2(player: Player): ReplacementEffect = {
case evt: Player#GainLife => player.GainLife(evt.life)
}
Но 1) это заменяет даже свой собственный lifegain с новым lifegain, 2) Я не могу ссылаться на игрока, который первоначально полученный жизнь в функции и 3) Я m отсутствует прямое соответствие life
так же.
Это может быть выражено с помощью континуального независимого типа, как
case Player.GainLife(_player, life) if _player != player => GainLife(player, life)
В идеале, я хочу что-то вроде
case _player.GainLife(life) if _player != player => player.GainLife(life)
Возможно ли это каким-то образом, или я могу обойти эту проблему? Или мне нужно прибегать к тому, чтобы сделать GainLife вложенным?
Думаю, я вижу, в каком направлении вы идете, но это не совсем то, что я хочу. Я доволен «GainLife» в зависимости от затронутого «Игрока», я просто хочу использовать этого игрока, пока он соответствует шаблону. Я добавил, что думаю, что вы предлагаете этот вопрос, но этого я бы хотел избежать, потому что я думаю, что GainLife, зависящий от пути, на самом деле чище, и это единственная причина для добавления объекта-компаньона. –
Кстати, спасибо за ваши ответы;) –
Я нашел способ, который я нахожу довольно удовлетворительным, не могли бы вы предложить некоторые улучшения, если у вас есть? –