Sil*_*eak 1 scala pattern-matching case-class
我有一个内部案例类,特别是来自这个问题的事件,并且想要匹配它,包括外部对象:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我可以轻松编写一个替换特定玩家生活事件的效果(部分功能):
//gain twice as much life
def effect(player: Player): ReplacementEffect = {
case player.GainLife(x) => player.GainLife(x * 2)
}
Run Code Online (Sandbox Code Playgroud)
但是,对于其他玩家我不能这样做.我最接近的是:
//only you gain life
def effect2(player: Player): ReplacementEffect = {
case evt: Player#GainLife => player.GainLife(evt.life)
}
Run Code Online (Sandbox Code Playgroud)
但是1)这甚至取代了你自己的生活费用新的生活费用,2)我不能引用最初在功能中获得生命的玩家和3)我错过了直接匹配life这种方式.
这可以使用与路径无关的类型表示
case Player.GainLife(_player, life) if _player != player => GainLife(player, life)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要类似的东西
case _player.GainLife(life) if _player != player => player.GainLife(life)
Run Code Online (Sandbox Code Playgroud)
这可能是某种方式,还是我可以解决这个问题?或者我是否必须使用GainLife嵌套?
当你在另一个类中定义类时,意味着该类型特定于周围的类,因此,如果你想让它代表相同的东西,那么playerA.GainLife与playerB.GainLife(这被称为路径依赖类型)的类型不同您可以在与实例无关的范围内定义它:包或类的伴随对象.
您可以在这个问题中阅读更多内容:Scala的路径依赖类型是什么意思?
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |