Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在object-Scala中存储常用字符串_String_Scala - Fatal编程技术网

String 在object-Scala中存储常用字符串

String 在object-Scala中存储常用字符串,string,scala,String,Scala,我想在对象中存储经常使用的字符串。除此之外,我还想方便地添加一个类似于mkString函数的功能,如果有两个特定类型的对象,它们可以附加一个特定字符或一组字符 以下是我到目前为止所拥有的: import org.scalatest._ class MyKey(val inputValue: String) { val value = inputValue def + (otherMyKeys: MyKey): MyKey = { new MyKey(this.value +

我想在对象中存储经常使用的字符串。除此之外,我还想方便地添加一个类似于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函数做同样的事情,但我觉得这并不是非常直观的。如何实现这一点?

您可以做的一件事是定义一个
apply()
方法,而不是重写
toString()

然后你得到

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


您的设计存在的问题是,任何类型的
MyKey
显然都不是
字符串。它几乎是一个
字符串
,但仍然需要一些催化剂来进行转换,比如
.toString()
或者,正如我所建议的,隐藏的。
apply()
方法

您可以使
MyKeys.SPARK
成为真正的
字符串
,但是
+
字符串
的方法已经有了意义,无法重新定义。如果您可以使用不同的操作符,那么就可以完成

object MyKeys {
  val SPARK = "spark"
  val JSON  = "json"
  val TITLE = "title"
  val URI   = "uri"
}

implicit class Dotter(str :String) {
  def *(append :String) = str + "." + append
}

MyKeys.SPARK * MyKeys.JSON * MyKeys.SPARK  //res0: String = spark.json.spark

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

然后你得到

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


您的设计存在的问题是,任何类型的
MyKey
显然都不是
字符串。它几乎是一个
字符串
,但仍然需要一些催化剂来进行转换,比如
.toString()
或者,正如我所建议的,隐藏的。
apply()
方法

您可以使
MyKeys.SPARK
成为真正的
字符串
,但是
+
字符串
的方法已经有了意义,无法重新定义。如果您可以使用不同的操作符,那么就可以完成

object MyKeys {
  val SPARK = "spark"
  val JSON  = "json"
  val TITLE = "title"
  val URI   = "uri"
}

implicit class Dotter(str :String) {
  def *(append :String) = str + "." + append
}

MyKeys.SPARK * MyKeys.JSON * MyKeys.SPARK  //res0: String = spark.json.spark

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

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

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

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

我试过这个,但它对我不起作用:我做错了什么?我也试过这个,但它不等于字符串“spark”。我不想对对象调用toString方法。我试过这个,但它对我不起作用:我做错了什么?我也试过这个,但它不等于字符串“spark”。我不想对对象调用toString方法。当我把它插入我的代码时,它不满足要求。你能澄清一下吗?当我通过
MyKeys.spark+MyKeys.json+MyKeys.title+MyKeys.uri
连接*时,我想得到一个等于“spark.json.title.uri”的字符串。我的测试用例显示的是当前状态,而不是期望的状态。在测试编号2中,所需状态应为
实际应等于(预期)
。请重新阅读我的答案。我建议
actual()应该等于(预期值)
。这是
actual()
不是
actual
。是的,但是有没有办法得到
实际值应该等于(预期值)
?原因是,如果经常使用的项是函数调用,那么代码将更加冗长
MyKeys.SPARK()+MyKeys.JSON()+MyKeys.TITLE()+MyKeys.URI()
MyKeys.SPARK+MyKeys.JSON+MyKeys.TITLE+MyKeys.URI()更难阅读,对吗?你有什么建议?当我把它插入我的代码时,它不符合要求。你能澄清一下吗?当我通过
MyKeys.spark+MyKeys.json+MyKeys.title+MyKeys.uri
连接*时,我想得到一个等于“spark.json.title.uri”的字符串。我的测试用例显示的是当前状态,而不是期望的状态。在测试编号2中,所需状态应为
实际应等于(预期)
。请重新阅读我的答案。我建议
actual()应该等于(预期值)
。这是
actual()
不是
actual
。是的,但是有没有办法得到
实际值应该等于(预期值)
?原因是,如果经常使用的项是函数调用,那么代码将更加冗长
MyKeys.SPARK()+MyKeys.JSON()+MyKeys.TITLE()+MyKeys.URI()
MyKeys.SPARK+MyKeys.JSON+MyKeys.TITLE+MyKeys.URI()更难阅读,对吗?你有什么建议?