【问题标题】:Underscores in numeric literals in scalascala中数字文字中的下划线
【发布时间】:2015-07-07 17:51:46
【问题描述】:

显然 scala 不支持 jdk7 及更高版本的数字文字中的下划线?

我正在使用 jdk 8

scala> System.getProperty("java.version")
res0: String = 1.8.0_40

这里我们尝试使用 jdk7(及更高版本)数字文字:

scala> val x = 1_000_000
<console>:1: error: Invalid literal number
       val x = 1_000_000
               ^

这有 scala 语言选项吗?

【问题讨论】:

  • 这是javac 的事情。没有理由认为scalac 会支持它。很少有 Java 语法是有效的 Scala。
  • 上周有a long [scala-debate] thread 讨论过这个问题。简短的回答:不,没有,但这可能有一天会在 Scala 中提供,同时有很多方法可以在没有太多语法噪音的情况下获得类似的东西。
  • @BoristheSpider Scala 在文字语法方面实际上非常接近 Java,因此期望它在这里支持下划线并非不合理。
  • @TravisBrown 随意根据您的评论做出回答,我会奖励
  • @TravisBrown 每天只吃一个答案,已经吃饱了。这提醒了我,我必须赶上特拉维斯布朗的答案。如果 Travis 在 Hulu 上会更容易。我永远不会错过任何一集。

标签: scala literals


【解决方案1】:

在 Scala 领域,您可能已经看到了类似的东西:

s"My name is $firstName"

sql"select id, name from members where id = ${id}"

没有理由不拥有:

i"1 000 000"

甚至:

animal"Dog" // checks that Dog is on the list of animal words

Scala 库中没有内置 i 字符串插值,但您可以使用:

implicit class IntContext(val sc: StringContext) {
  def i(args: Any*): Int = {
    val orig = sc.s(args: _*)
    orig.replace(" ", "").toInt
  }
}

i"1 000 000" // res0: Int = 1000000

【讨论】:

  • 谢谢,但我特别想知道内置编译器支持 - OP 的 cmets 之一解决得很好。
  • 没有内置支持。如果性能不是问题,则必须毫无间隙地写出数字或使用我在此处解释的方法。
  • 我很欣赏你的方法,但我不需要暗示:如果没有语言支持,那就这样吧。似乎尚未决定是否提供未来支持。
  • 不要使用它 :) 不要担心 :) 这是我见过的用于类似验证/解析要求的一种方法。并不意味着我、你或其他任何人都必须使用它。老实说,我不确定 Java 的下划线。例如 Int(100,000,000) 似乎更好。
  • +1 因为这是目前的规范答案。除非它重复一个规范的答案。我认为这是逆名的宏观世界中的第一个例子。不,那是 showTree;一周后二进制文字出现了。
【解决方案2】:

注意,从Scala 2.13 开始,下划线被接受为数字文字分隔符:

val x = 1_000_000
// x: Int = 1000000
val pi = 3_14e-0_2
// pi: Double = 3.14

【讨论】:

  • @javadba,是的,我知道...,您在 Spark 上使用 Scala,并且永远无法使用 Scala 2.13!
  • 是的,我几乎每天都在使用 scala,从未接触过 2.12 .. 2.13 将再过 3-5 年
【解决方案3】:

由于 Java 7 中的更新,您现在可以编写具有出色可读性的冗长数字文字。在 Adeva 的博客 https://adevait.com/java/5-best-and-worst-practices-in-java-coding 上阅读更多信息

使用下划线之前:

int minUploadSize = 05437326;
long debitBalance = 5000000000000000L;
float pi = 3.141592653589F;

使用下划线后:

int minUploadSize = 05_437_326;
long debitBalance = 5_000_000_000_000_000L;
float pi = 3.141_592_653_589F;

上述 Java 中的声明显示了在数字文字中使用下划线来提高代码可读性的重要性。当您比较上面的两个声明时,您将能够推断出包含下划线的声明与另一个相比更具可读性。

【讨论】:

  • 这是@XavierGuihot 的重复答案(从 2019 年开始)
猜你喜欢
  • 2017-09-19
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 2021-07-04
  • 2018-04-10
  • 1970-01-01
相关资源
最近更新 更多