Scala 借用 Java String类似 toUpperCase 的方法/toLowerCase .
但是,其实现方式并不十分一致:
- JVM 上的 Scala 与 Java 语义非常接近,因此:
toUpperCase()
是区域设置敏感的,并坚持默认区域设置(在土耳其语区域设置中会给你臭名昭著的 i → і 问题)- 为了避免这种情况并保持区域设置不敏感(类似 en_US/C)的过程,您需要专门执行
toUpperCase(Locale.ROOT)
- Scala.JS 没有实现 Locale 的概念, 因此:
toUpperCase()
以区域设置不敏感的方式工作toUpperCase(Locale locale)
方法在 ScalaJS 中实际上不可用
如何实现在 JVM/JS 上都能在 Scala 中工作的不区分区域设置的大小写转换?
我可以想到几种方法,但它们都很难看:
方法一:我自己的实现
针对英语字母表的 26 个 ASCII 字符实现我自己的 toUpperCase
。
方法 1.1:我自己使用 Scala 字符实现
基本相同,但至少重用了Scala toUpper转换单个字符。
方法2:接口(interface)
实现类似的东西
trait CaseChangeOps {
def toUpperCase(s: String): String
}
object Main {
var caseChanger: CaseChanger
}
// whenever I want to use it, do it like that:
Main.caseChanger.toUpperCase("like this") // => "LIKE THIS"
在共享代码中,然后在JS中有:
object CaseChangerJs {
def toUpperCase(s: String): String = s.toUpperCase
}
object MainJs {
Main.caseChanger = CaseChangerJs
}
...在 JVM 中:
object CaseChangerJvm {
def toUpperCase(s: String): String = s.toUpperCase(Locale.ROOT)
}
object MainJvm {
Main.caseChanger = CaseChangerJvm
}
方法3:引入外部scala-java-locales
有一个独特的第三方库 scala-java-locales ,它被列为 ScalaJS 兼容,可用于增强 ScalaJS。
不过,这看起来像是一个巨大的杀伤力,因为我实际上只需要区域设置不敏感大小写转换,而不是所有可能的区域设置的全部内容。
还有更好的想法吗?
最佳答案
标准方法与方法 2 接近,但简单得多。在共享代码中,您只需调用
Platform.toUpperLocaleInsensitive(string)
在 JVM 和 JS 上有不同的实现:
// JVM
object Platform {
def toUpperLocaleInsensitive(s: String) = s.toUpperCase(Locale.ROOT)
// other methods with different implementations
}
// JS
object Platform {
def toUpperLocaleInsensitive(s: String) = s.toUpperCase()
// other methods with different implementations
}
参见Hands-on Scala.js中类似案例的描述。
这是可行的,因为共享代码不需要自行编译,只需与特定于平台的代码一起编译即可。
关于java - Scala 与 Java toUpperCase/toLowerCase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60486347/