Scala与Java toUpperCase / toLowerCase

问题描述 投票:0回答:1

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中都可以使用的不区分语言环境的大小写转换?

我可以想到几种方法,所有这些都很难看:

方法1:我自己的实现

用我自己的toUpperCase表示26个英文字母的ASCII字符。

方法1.1:我自己使用Scala字符的实现

基本上相同,但至少要重用Scala toUpper来转换单个字符。

方法2:界面

实施类似

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进行扩展。

但是,看起来像是一个巨大的矫kill过正,因为我实际上只需要locale-insensitive大小写转换,而不是所有可能的语言环境的全部内容。

还有更好的主意吗?

java scala locale case-sensitive scala.js
1个回答
0
投票

标准方法与您的方法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中类似情况的描述。

© www.soinside.com 2019 - 2024. All rights reserved.