gpt4 book ai didi

Scala 错误或功能?大写字母变量的多重赋值错误

转载 作者:行者123 更新时间:2023-12-04 22:58:05 25 4
gpt4 key购买 nike

假设函数 r返回五个值的元组。

scala> def r = (1,2,3,4,5)
r: (Int, Int, Int, Int, Int)

当我从 r 分配返回值时,大写字母变量出现错误。
scala> val (a,b,c,d,E) = r
<console>:13: error: not found: value E
val (a,b,c,d,E) = r
^

如果我不使用大写字母,则不会发生错误。
scala> val (a,b,c,d,e) = r
a: Int = 1
b: Int = 2
c: Int = 3
d: Int = 4
e: Int = 5

但是,我可以使用单个assignemnt 分配大写字母变量。
scala> val Q = 10
Q: Int = 10

这是 Scala 的错误或功能吗?

最佳答案

这是一个功能......尽管不是很理想。

当您这样做时val (a,b,c) = tuple ,它实际上是一个模式匹配:

tuple match {
case (a,b,c) => ...
}

现在,上面的语句使用 unapply 从元组中提取三个值,并将它们分配给 a、b 和 c。但是这个:
tuple match {
case (1, 2, 3) => ...
}

做一些不同的事情。它从元组中提取三个值,并将它们与左侧的三个值进行比较。如果你想匹配一个变量怎么办:
val foo = 1
val bar = 2
val bat = 3

tuple match {
case(foo, bar, bat) => ...
}

这不起作用:这种情况与第一种情况完全相同,并且会做完全相同的事情:它将从元组中提取值到三个(新的)局部变量中,没有任何匹配。但是如果你想匹配变量怎么办?如何解决这个问题?有两种方法:您可以将变量名称括在反引号中,或者使名称以大写字母开头:
  val Foo = 1
val bar = 2
var baz = 3

tuple match {
case(Foo, `bar`, `bat`) => ...
}

总结一下: tuple match { case (foo, _) =>表示“从元组中提取第一个元素并分配给一个新变量 footuple match { case (Foo, _) 表示”执行这个 case如果元组的第一个元素等于现有变量的值 Foo ”。
“赋值”遵循相同的逻辑(因为它们并不是真正的“赋值”,而只是模式匹配的另一种语法),所以,当你说 val (a,b,c,d,E) = r 时,表示“将 r 的前四个元素分配给新变量,并将最后一个元素与现有变量 E 进行匹配”。但是 E不存在,因此错误。

关于Scala 错误或功能?大写字母变量的多重赋值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36368024/

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