将常用字符串存储在对象中-Scala

时间:2018-10-03 03:41:14

标签: string scala

我想将常用字符串存储在一个对象中。最重要的是,我还想方便地添加一个类似于mkString函数的功能,如果有两个特定类型的对象,则可以在它们后面附加一个特定字符或一组字符。

这是我到目前为止所拥有的:

import org.scalatest._

class MyKey(val inputValue: String) {
  val value = inputValue

  def + (otherMyKeys: MyKey): MyKey = {
    new MyKey(this.value + "." + otherMyKeys.value)
  }

  override def toString(): String = this.value.toString
}

object MyKeys {
  val SPARK = new MyKey("spark")
  val JSON = new MyKey("json")
  val TITLE = new MyKey("title")
  val URI = new MyKey("uri")
}

class MyKeySpec extends FlatSpec with Matchers {
  "MyKey" should "not put a fullstop character when there is only one value" in {
    MyKeys.SPARK should not equal("spark")
    MyKeys.SPARK.toString() should equal("spark")
  }

  it should "put a fullstop character between multiple keys" in {
    val actual = MyKeys.SPARK + MyKeys.JSON + MyKeys.TITLE + MyKeys.URI
    val expected = "spark.json.title.uri"
    actual should not equal(expected)
    actual.toString() should equal(expected)
  }

  it should "work even when the same key is repeated multiple times" in {
    val actual = MyKeys.SPARK + MyKeys.SPARK + MyKeys.SPARK
    val expected = "spark.spark.spark"
    actual should not equal(expected)
    actual.toString() should equal(expected)
  }
}

该解决方案在使用“ +”函数时非常出色,但如果没有toString则无法使用。有没有一个甚至不需要使用toString函数的更优雅的解决方案?目的是将类似“ spark.json.spark.spark”的字符串设置为MyKeys.SPARK + MyKey.JSON + MyKey.SPARK + MyKey.SPARK

我可以使用mkString函数执行相同的操作,但是我觉得这不是超级直观。我该如何实现?

2 个答案:

答案 0 :(得分:2)

您可能要做的一件事是定义一个apply()方法,而不是覆盖toString()

def apply(): String = this.value

那你得到...

MyKeys.SPARK should not equal("spark")
MyKeys.SPARK() should equal("spark")

...等等


设计的问题是,MyKey类型的任何东西显然都不是String。它几乎是String的一个,但仍然需要一些催化剂来进行过渡,例如.toString()或我建议的隐藏。apply()方法。 / p>

您可以将MyKeys.SPARK设为真实的String,但是+的{​​{1}}方法已经具有含义,无法重新定义。如果您确定使用其他运算符可以,那么可以这样做。

String

答案 1 :(得分:0)

您是否考虑过为此使用隐式转换?

class MyKey(val value: String) {
  def + (otherMyKeys: MyKey): MyKey = {
    new MyKey(this.value + "." + otherMyKeys.value)
  }
}

object MyKey {
  implicit def myKeyToString(myKey: MyKey): String = myKey.value
}

object MyKeys {
  val SPARK = new MyKey("spark")
  val JSON = new MyKey("json")
}

val result: String = MyKeys.SPARK + MyKeys.JSON // spark.json