gpt4 book ai didi

string - 重载方法调用有替代 : String. 格式

转载 作者:行者123 更新时间:2023-12-04 13:31:49 27 4
gpt4 key购买 nike

我在下面编写了以下 Scala 代码来处理我传入的字符串,格式化字符串,将其附加到 StringBuilder并返回格式化的 String使用转义的 unicode 返回给我的调用者进行其他处理。

Scala 编译器在有 String.format 的行上提示以下内容调用时出现以下错误:

overloaded method value format with alternatives: (x$1; java.util.Locale; x$2: String, X$3: Object*) (x$1:String,x$2: Object*) String cannot be applied to (*String, Int)


class TestClass {    
private def escapeUnicodeStuff(input: String): String = {
//type StringBuilder = scala.collection.mutable.StringBuilder
val sb = new StringBuilder()
val cPtArray = toCodePointArray(input) //this method call returns an Array[Int]
val len = cPtArray.length
for (i <- 0 until len) {
if (cPtArray(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)) //**complains here**
} else if (codePointArray(i) > 127) {
sb.append(String.format("\\u%04x", codePointArray(i))) //**complains here**
} else {
sb.append(String.format("%c", codePointArray(i))) //**complains here**
}
}
sb.toString
}

}

我该如何解决这个问题?如何清理代码以实现格式化字符串的目的?在此先感谢 Scala 专家

最佳答案

String.format Java 中的方法需要 Objects作为其论据。 Object Java 中的 type 等价于 AnyRef输入 Scala。 Scala 中的原始类型扩展 AnyVal – 不是 AnyRef .阅读有关 AnyVal 之间差异的更多信息, AnyRef , 和 Any in the docs或在 this answer .最明显的修复方法是使用 Integer来自 Java 的包装类以获取 Object您的 Ints 的代表:

String.format("\\u%04x\\u%04x", new Integer(hi), new Integer(lo))

使用这些包装器类几乎是单一 Scala 代码的象征,并且只有在没有更好的选择时才应该用于与 Java 的互操作性。在 Scala 中更自然的方法是使用 StringOps 等效方法 format :
"\\u%04x\\u%04x".format(hi, lo)

您也可以使用 f interpolator更简洁的语法:
f"\\u$hi%04x\\u$lo%04x"

另外,使用 for像这里这样的循环在 Scala 中是单语的。您最好使用其中一种功能列表方法,例如 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"
}

或者偶数 map后跟一个 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

关于string - 重载方法调用有替代 : String. 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29882459/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com