我想比较字符串
中的模式sealed trait Demo { def value: String }
object Demo {
case object TypeAB extends Demo {
val value = "a:b"
}
.......other constants
}
val test = Option("a:b:c")
val s =test.map(_.startsWith(Demo.TypeAB.value))
我希望.value
中不使用Demo.TypeAB.value
是否有更好的方法来实现上述目标。我更喜欢使用startsWith
我试过但它没有用
def unapply(arg: Demo): String= arg.value
答案 0 :(得分:1)
sealed trait Demo {
def value: String
}
object Demo {
case object TypeAB extends Demo {
val value = "a:b"
}
implicit def demoToString(demo: Demo): String = demo.value
}
您现在可以写"a:b:c".startsWith(Demo.TypeAB)
在代码中使用隐式Demo to string方法是否是一个好主意,好吧,我会留给你:D
答案 1 :(得分:0)
您可以向Demo
添加提供所需测试的谓词:
sealed trait Demo {
def value: String
def startsWith(body: Option[String]): Boolean = body match {
case Some(content) => content.startsWith(value)
case _ => false
}
}
这允许您以更广泛的界面为代价隐藏实现细节。
答案 2 :(得分:0)
这是否是一种更好的方法:
sealed trait Demo {
def value: String
def startsWith(s: String): Boolean = s.startsWith(value)
}
object Demo {
case object TypeAB extends Demo {
val value = "a:b"
}
}
val test = Option("a:b:c")
val s = test.map(Demo.TypeAB.startsWith(_))
println(s)
或者你想使用隐含魔法,比如
sealed trait Demo { def value: String }
implicit class DemoStringOps(val s: String) extends AnyRef {
def startsWith(d: Demo) = s.startsWith(d.value)
}
object Demo {
case object TypeAB extends Demo {
val value = "a:b"
}
}
val test = Option("a:b:c")
val s = test.map(_.startsWith(Demo.TypeAB))
println(s)