gpt4 book ai didi

Scala模式匹配小写变量名

转载 作者:行者123 更新时间:2023-12-03 21:01:55 26 4
gpt4 key购买 nike

我发现当使用模式匹配和替代(对于字符串)时,Scala 接受以大写开头的变量(在下面的示例中, MyValue1MyValue2 ),但不接受以小写开头的变量( myValue1myValue2 )。这是一个错误还是 Scala 的一个特性?我在 2.8 版中得到了这个。如果这是一个功能,任何人都可以解释其背后的基本原理吗?这是我使用的代码:

val myValue1 = "hello"
val myValue2 = "world"
val MyValue1 = "hello"
val MyValue2 = "world"

var x:String = "test"

x match {
case MyValue1 | MyValue2 => println ("first match")
case myValue1 | myValue2 => println ("second match")
}

运行时,我得到以下信息:
scala> val myValue1 = "hello"
myValue1: java.lang.String = hello

scala> val myValue2 = "world"
myValue2: java.lang.String = world

scala> val MyValue1 = "hello"
MyValue1: java.lang.String = hello

scala> val MyValue2 = "world"
MyValue2: java.lang.String = world

scala> var x:String = "test"
x: String = test

scala> x match {
| case MyValue1 | MyValue2 => println ("first match")
| case myValue1 | myValue2 => println ("second match")
| }
<console>:11: error: illegal variable in pattern alternative
case myValue1 | myValue2 => println ("second match")
^
<console>:11: error: illegal variable in pattern alternative
case myValue1 | myValue2 => println ("second match")
^

编辑 :

所以它确实是一个特性而不是一个错误......谁能提供一个例子,这可能有用吗?

当我使用:
x match {
case myValue1 => println ("match")
case _ =>
}

我在最后一种情况下收到 unreachable code 警告,暗示第一种情况总是匹配的。

最佳答案

这是一个特点。为了模式匹配的目的,以大写字母开头的稳定标识符被视为文字,而小写标识符被“分配给”,因此您可以将匹配的值用于其他内容。

你举了一个没有意义的例子:

x match {
case myValue1 => println ("match")
case _ =>
}

但是如果我们稍微改变一下,就很容易看出这种感觉:
x match {
case MyValue1 => println("match")
case MyValue2 => println("match")
case other => println("no match: "+other)
}

当然,可以使用 x而不是 other上面,但这里有一些不方便的例子:
(pattern findFirstIn text) {
// "group1" and "group2" have been extracted, so were not available before
case pattern(group1, group2) =>

// "other" is the result of an expression, which you'd have to repeat otherwise
case other =>
}

getAny match {
// Here "s" is a already a string, whereas "getAny" would have to be typecast
case s: String =>

// Here "i" is a already an int, whereas "getAny" would have to be typecase
case i: Int =>
}

因此,模式匹配将匹配的值分配给标识符很方便的原因有很多。

现在,尽管我认为这是 Scala 最大的错误之一,因为它是如此微妙和独特,其背后的原因是,在推荐的 Scala 风格中,常量以大写字母开头,而方法和 val和 vars (它们也是真正的方法)是以小写字母开头的驼峰式大小写。因此,常量自然地被视为文字,而其他常量则被视为可分配的标识符(可能会影响在外部上下文中定义的标识符)。

关于Scala模式匹配小写变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com