String 在object-Scala中存储常用字符串
我想在对象中存储经常使用的字符串。除此之外,我还想方便地添加一个类似于mkString函数的功能,如果有两个特定类型的对象,它们可以附加一个特定字符或一组字符 以下是我到目前为止所拥有的: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 +
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()更难阅读,对吗?你有什么建议?