重载的方法调用有多种选择:String.format
我在下面编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到重载的方法调用有多种选择:String.format,string,scala,unicode,stringbuilder,String,Scala,Unicode,Stringbuilder,我在下面编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到StringBuilder中,并将带转义unicode的格式化字符串返回给调用方进行其他处理 Scala编译器在有String.format调用的行中抱怨以下错误: 重载的方法值格式和可选项:(x$1;java.util.Locale;x$2:String,x$3:Object*)(x$1:String,x$2:Object*)字符串不能应用于(*String,Int) 类TestClass{ 私有def escape
StringBuilder
中,并将带转义unicode的格式化字符串返回给调用方进行其他处理
Scala编译器在有String.format
调用的行中抱怨以下错误:
重载的方法值格式和可选项:(x$1;java.util.Locale;x$2:String,x$3:Object*)
(x$1:String,x$2:Object*)
字符串不能应用于(*String,Int)
类TestClass{
私有def escapeUnicodeStuff(输入:字符串):字符串={
//输入StringBuilder=scala.collection.mutable.StringBuilder
val sb=新的StringBuilder()
val cPtArray=toCodePointArray(input)//此方法调用返回一个数组[Int]
val len=cPtArray.length
用于(i 65535){
val hi=(cPtArray(i)-0x10000)/0x400+0xD800
val lo=(cPtArray(i)-0x10000)%0x400+0xDC00
sb.append(String.format(\\u%04x\\u%04x),hi,lo))/**在这里抱怨**
}else if(codePointArray(i)>127){
sb.append(String.format(“\\u%04x”,codePointArray(i))//**在这里抱怨**
}否则{
sb.append(String.format(“%c”,codePointArray(i))/**在这里抱怨**
}
}
使某人扭动
}
}
我如何解决这个问题?如何清理代码以实现格式化字符串的目的?提前感谢这里的Scala专家我无法确定到底是什么导致了“过载冲突”,但请注意下面的代码:
scala> "\\u%04x\\u%04x".format(10,20)
res12: String = \u000a\u0014
使用works提供的方法。Java中的方法期望对象
作为其参数。Java中的对象
类型相当于Scala中的AnyRef
类型。Scala中的基元类型扩展了AnyVal
——而不是AnyRef
。阅读更多有关AnyVal
、AnyRef
和Any
或中的区别的信息。最明显的修复方法是使用Java中的整数
包装类来获取对象
表示您的整数
:
String.format("\\u%04x\\u%04x", new Integer(hi), new Integer(lo))
使用这些包装类几乎是unidiomatic Scala代码的象征,只有在没有更好的选择时,才应该用于与Java的互操作性。在Scala中,更自然的方法是使用等效的方法format
:
"\\u%04x\\u%04x".format(hi, lo)
您还可以使用更简洁的语法:
f"\\u$hi%04x\\u$lo%04x"
此外,在Scala中,使用类似于此处的for
循环是不规则的。最好使用函数列表方法之一,如map
、foldLeft
,甚至foreach
以及使用match
语法的部分函数。例如,您可以尝试以下操作:
toCodePointArray(input).foreach {
case x if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
sb.append(f"\\u$hi%04x\\u$lo%04x")
case x if > 127 => sb.append(f"\\u$x%04x")
case x => sb.append(f"$x%c")
}
或者,如果您不必使用StringBuilder
,它实际上只需要在附加许多字符串的情况下使用,那么您可以用foldLeft
替换整个方法体:
def escapeUnicodeStuff(input: String) = toCodePointArray(input).foldLeft("") {
case (acc, x) if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
acc + f"\\u$hi%04x\\u$lo%04x"
case (acc, x) if x > 127 => acc + f"\\u$x%04x"
case (acc, x) => acc + f"$x%c"
}
或偶数映射
,后跟mkString
:
def escapeUnicodeStuff(input: String) = toCodePointArray(input).map {
case x if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
f"\\u$hi%04x\\u$lo%04x"
case x if x > 127 => f"\\u$x%04x"
case x => f"$x%c"
}.mkString
您是指StringOps提供的方法吗?再次感谢您的编辑。这个问题看起来好多了。谢谢你花这么多时间和精力来回答。我喜欢你的解释非常清晰和翔实。我喜欢非常优雅的case方法。对于第二种解决方案,编译器说:类型不匹配:需要单元:StringI正确。你的代码非常完美。我只是看得不对。谢谢
def escapeUnicodeStuff(input: String) = toCodePointArray(input).map {
case x if x > 65535 =>
val hi = (x - 0x10000) / 0x400 + 0xD800
val lo = (x - 0x10000) % 0x400 + 0xDC00
f"\\u$hi%04x\\u$lo%04x"
case x if x > 127 => f"\\u$x%04x"
case x => f"$x%c"
}.mkString