scala - 将元组的值分配给Scala中的单个变量
问题描述
将元组的值分配给单个变量是否有很好的可能性?这是我想做的,但它会引发错误:
var a : Int = _
var b : Int = _
def init() {
(a,b) = getTuple() // returns (Int, Int)
}
def someFunction = {
// use a here
}
def someOtherFunction = {
// use b here
}
Error: ';' expected but '=' found.
(a, b) = getTuple()
我真的必须做这 ._1 和 ._2 的事情吗?
val tuple = getTuple() // returns (Int, Int)
a = tuple._1
b = tuple._2
谢谢回答。
解决方案
正如您在 Scala 语言规范的第 6.15 节赋值中所见,赋值表达式的左侧必须是裸标识符:
foo = ???
// either an assignment to a local mutable `var` or syntactic sugar for:
foo_=(???)
会员访问:
foo.bar = ???
// syntactic sugar for:
foo.bar_=(???)
或方法调用:
foo(bar) = ???
// syntactic sugar for:
foo.update(bar, ???)
模式匹配仅适用于值定义(参见第 4.1 节值声明和定义)和变量定义(参见第 4.2 节变量声明和定义)。
因此,以下两种情况都是合法的:
var (a, b) = getTuple()
val (a, b) = getTuple()
顺便说一句,您的代码中有许多非常不习惯的东西:
- 将空参数列表传递给方法调用是非常不寻常的。通常,没有参数的方法应该没有参数列表,而不是一个空的参数列表。唯一的例外是具有副作用的方法,其中空参数列表用作一种“警告标志”,但具有副作用的方法也非常不习惯。所以,
getTuple
应该像这样定义和调用:
代替def getTuple = ??? getTuple
def getTuple() = ??? getTuple()
- 另一方面,如果该方法确实有副作用,则不应调用它,
getTuple
因为这意味着该方法“获得”了某些东西,并且没有迹象表明它也改变了某些东西。 - 在 Scala 中,getter 和 setter 不被调用
getFoo
,setFoo
而是foo
andfoo_=
,因此该方法应该被调用tuple
。 - 可变变量也是高度非惯用的,它们可能更应该是
val
s。
推荐阅读
- android - 带有 OkHttp 的 HTTP 版本
- python - 模型选择字段在模板上返回空值
- ios - iOS:UIScrollView 不会对所有值进行采样
- python-3.x - 熊猫数据框从去年同月获取滞后值
- reporting-services - 我想根据注入的字段来计算数量
- python - 在时间戳上连接两个不同的数据帧
- powershell - 从 [Reflection.Assembly]::Load() 加载的 DLL 导出 Powershell CMDlet
- javascript - 使用全局变量作为 mongodb 文档的计数器是否错误?
- python - 在运行“迁移”命令之前删除 Django 迁移文件?
- python - 将结果取决于先前结果的函数应用于 numpy 数组