在scala中将字符串与startWith进行比较

时间:2017-12-04 13:41:05

标签: string scala

我想比较字符串

中的模式
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

3 个答案:

答案 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)