Scala 与 Java toUpperCase/toLowerCase
Scala vs Java toUpperCase/toLowerCase
Scala 借用 Java String methods like toUpperCase/toLowerCase.
但是,这样做的方式不是很一致:
- JVM 上的 Scala 接近 Java 语义,因此:
toUpperCase()
对区域设置敏感并坚持使用默认区域设置(在土耳其语区域设置中给你带来臭名昭著的 i → İ 问题)
- 为了避免这种情况并保持语言环境不敏感(en_US / C-like)过程,你需要专门做
toUpperCase(Locale.ROOT)
- Scala.JS 没有实现 Locale 的概念,因此:
toUpperCase()
以不区分语言环境的方式工作
toUpperCase(Locale locale)
方法在 ScalaJS 中实际上不可用
如何在 Scala 中实现不区分大小写的转换 JVM/JS?
我想了几个办法,都一样丑:
方法一:我自己实现
为英文字母的 26 个 ASCII 字符实现我自己的 toUpperCase
。
方法 1.1:我自己使用 Scala 字符实现
基本相同,但至少重用 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
有一个独特的第 3 方库 scala-java-locales,它被列为与 ScalaJS 兼容,可用于增强 ScalaJS。
不过看起来有点矫枉过正,因为我实际上只需要 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中对类似案例的描述。
之所以可行,是因为共享代码不需要自行编译,只需与特定于平台的代码一起编译即可。
Scala 借用 Java String methods like toUpperCase/toLowerCase.
但是,这样做的方式不是很一致:
- JVM 上的 Scala 接近 Java 语义,因此:
toUpperCase()
对区域设置敏感并坚持使用默认区域设置(在土耳其语区域设置中给你带来臭名昭著的 i → İ 问题)- 为了避免这种情况并保持语言环境不敏感(en_US / C-like)过程,你需要专门做
toUpperCase(Locale.ROOT)
- Scala.JS 没有实现 Locale 的概念,因此:
toUpperCase()
以不区分语言环境的方式工作toUpperCase(Locale locale)
方法在 ScalaJS 中实际上不可用
如何在 Scala 中实现不区分大小写的转换 JVM/JS?
我想了几个办法,都一样丑:
方法一:我自己实现
为英文字母的 26 个 ASCII 字符实现我自己的 toUpperCase
。
方法 1.1:我自己使用 Scala 字符实现
基本相同,但至少重用 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
有一个独特的第 3 方库 scala-java-locales,它被列为与 ScalaJS 兼容,可用于增强 ScalaJS。
不过看起来有点矫枉过正,因为我实际上只需要 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中对类似案例的描述。
之所以可行,是因为共享代码不需要自行编译,只需与特定于平台的代码一起编译即可。