java - Scala vs Java toUpperCase/toLowerCase
问题描述
Scala 借用了 Java String方法,例如toUpperCase / toLowerCase。
但是,它这样做的方式不是很一致:
- JVM 上的 Scala 坚持接近 Java 语义,因此:
toUpperCase()
对语言环境敏感并坚持默认语言环境(在土耳其语言环境中给你臭名昭著的 i → İ 问题)- 为了避免这种情况并保持对语言环境不敏感(en_US / C-like)的过程,你需要专门做
toUpperCase(Locale.ROOT)
- Scala.JS 没有实现Locale的概念,因此:
toUpperCase()
以不区分语言环境的方式工作toUpperCase(Locale locale)
方法在 ScalaJS 中实际上不可用
如何在 JVM/JS 上的 Scala 中实现不区分区域设置的大小写转换?
我可以想到几种方法,所有方法都很丑:
方法一:我自己的实现
toUpperCase
为英文字母的 26 个 ASCII 字符实现我自己的。
方法 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
有一个独特的 3rd 方库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中对类似案例的描述。
这是有效的,因为共享代码不需要自己编译,只需要与特定于平台的代码一起编译。
推荐阅读
- regex - RegEx 句子必须包含辅音和元音
- reactjs - 如何根据 REACT 中的值更改引导按钮的大小
- mongodb - 时间戳与 ISO 8601 日期时间字符串上的 Mongodb 索引
- visual-studio - 通过 Visual Studio 部署到 azure 失败
- android - 在使用 webview 开发的应用程序中访问手机存储
- r - 替换“大致”相同的值
- python - 使用 numpy 查找范围元组之间的交集
- arrays - 如何以实际格式在服务器上发布数据?
- javascript - 不能在 React 函数中使用 Hook
- python - 在 Python 中使用 plotly 绘制 3D 曲面图