【问题标题】:Multiple constants assignment in ScalaScala中的多个常量赋值
【发布时间】:2016-09-10 11:56:54
【问题描述】:

知道为什么我可以使用一个元组分配多个变量,而不是多个常量吗?

scala> val (myVar1, myVar2) = (1, 2)
myVar1: Int = 1
myVar2: Int = 2

scala> val (MyConst1, MyConst2) = (1, 2)
<console>:7: error: not found: value MyConst1
       val (MyConst1, MyConst2) = (1, 2)
            ^
<console>:7: error: not found: value MyConst2
       val (MyConst1, MyConst2) = (1, 2)
                      ^

我认为实际上这只是命名约定的问题,但这似乎 Scala 以不同的方式处理具有大写/小写首字母的标识符。

【问题讨论】:

标签: scala variable-assignment


【解决方案1】:

正如 Samar 在他的评论中所建议的那样,由于您声明了多个变量,因此涉及到模式匹配,并且这些大写标识符实际上被视为类,正如您的 REPL 错误所暗示的那样,无法找到它们。

scala> var (Const1, Const2) = (1, 2)
<console>:7: error: not found: value Const1    // <- Const1 class not found
       var (Const1, Const2) = (1, 2)
            ^
<console>:7: error: not found: value Const2   // <- Const2 class not found
       var (Const1, Const2) = (1, 2)    
                    ^

scala> var (const1, const2) = (1, 2)   // <- const1, const2 not treated as classes in this case
const1: Int = 1
const2: Int = 2

【讨论】:

  • 不需要的类,常量也可以。它们根本不被视为要绑定的变量。 val One = 1; 1 match { case One =&gt; true; case _ =&gt; false }
【解决方案2】:

Pattern matching section 提到了varid(例如Simple Pattern)。现在在syntax summaryvarid中定义为

lower            ::=  ‘a’ | … | ‘z’ // and Unicode category Ll
...
varid            ::=  lower idrest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多