Scala借用了Java String方法,例如toUpperCase / toLowerCase。
但是,这样做的方式不是很一致:
toUpperCase()
是对语言环境敏感的,并坚持默认语言环境(给您带来臭名昭著的i→土耳其语言环境中的问题)]toUpperCase(Locale.ROOT)
toUpperCase()
以不区分语言环境的方式工作]toUpperCase(Locale locale)
方法实际上在ScalaJS中不可用我如何实现在JVM / JS上的Scala中都可以使用的不区分语言环境的大小写转换?
我可以想到几种方法,所有这些都很难看:
用我自己的toUpperCase
表示26个英文字母的ASCII字符。
基本上相同,但至少要重用Scala toUpper来转换单个字符。
实施类似
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
}
[有一个独特的第三方库scala-java-locales,它被列出为与ScalaJS兼容的,可用于对ScalaJS进行扩展。
但是,看起来像是一个巨大的矫kill过正,因为我实际上只需要locale-insensitive大小写转换,而不是所有可能的语言环境的全部内容。
还有更好的主意吗?
标准方法与您的方法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中类似情况的描述。