【问题标题】:Typesafe Hierarchichal Structure类型安全的层次结构
【发布时间】:2017-04-05 07:20:26
【问题描述】:

我想编写一个 API,让我可以轻松创建分层键,例如

/ foo / bar / baz

为此,我创建了以下类:

sealed trait Key {
  def path: String

  def /(key: String): Node = Node(this, key)
}

case object Root extends Key {
  override def path: String = ""
}

final case class Node(parent: Key, key: String) extends Key {
  override def path: String = s"${parent.path}/$key"
}

而且效果很好:

Root / "foo" / "bar"

现在,我还希望能够像这样包含“占位符”:

Root / "foo" / %

然后这应该返回一些东西,当一个字符串被应用时返回一个Key对象,并替换了给定的值,即

(Root / "foo" / %)("bar") == Root / "foo" / "bar"

请记住,这应该适用于 n 级,如下所示:

Root / % / "foo" / % / "bar"

【问题讨论】:

  • (Root / % / "foo" / % / "bar")("baz") 会是什么?

标签: scala type-safety


【解决方案1】:

这可能不是很有效,但它可以满足您的要求。

请注意,在回答我自己的评论时,我决定这样做

(Root / % / "foo" / % / "bar")("baz") == (Root / % / "foo" / "baz" / "bar")

但没有太多改变可以得到不同的结果。

object % // only for nicer API

trait Slashable[T <: Slashable[T]] {
  def /(key: String): T
  def /(p: %.type): PlaceHeld[T] = PlaceHeld[T](str => /(str))
}

case object Root extends Key {
  override def path: String = ""
}

sealed trait Key extends Slashable[Key] {
  def path: String

  def /(key: String): Node = Node(this, key)
}


final case class Node(parent: Key, key: String) extends Key {
  override def path: String = s"${parent.path}/$key"
}

case class PlaceHeld[T <: Slashable[T]](replace: String => T) extends Slashable[PlaceHeld[T]]{
  def /(key: String) = PlaceHeld(str => replace(str)./(key))
  def apply(key: String) = replace(key)
}

编辑

您可能想用一个简单的(包装的)Seq 替换您的基本类型(不带占位符):

case class Key(pathSeq: Seq[String]) extends Slashable[Key] {
  def path = pathSeq.mkString("/")
  def /(key: String) = Key(pathSeq :+ key)
}

object Root extends Slashable[Root] { 
  def path = ""                       //this is because we cannot do 
  def /(key: String) = Key(Seq(key))  //Root extends Key(Seq())
}

【讨论】:

    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2016-09-14
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2013-12-25
    • 2022-10-18
    相关资源
    最近更新 更多