Scala 并行赋值仅在声明中 [英] Scala parallel assignments only in declarations

查看:46
本文介绍了Scala 并行赋值仅在声明中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有:

def f() = {(1, 二", 3.0)}

为什么没问题

var (x, y, z) = f()

但不是

<前><代码>变量 i = 0var j = "你好"无功k = 0.0//使用 i, j, k...//然后(i, j, k) = f()//;预期但=找到

?

解决方案

您在此处看到初始化变量时模式匹配的有限版本.请注意,这不仅适用于元组:

val a :: b = List(1,2,3)打印(一)//1println(b)//列表(2, 3)

这个特性似乎是直接从 Haskell 借来的,在那里你也可以使用模式进行初始化:

let (a,b) = getTuple在 a*b

由于 Haskell 没有可变数据,因此无法赋值.

在 Scala 中,你可以做这样的事情,但我想这被认为太混乱了,或者太难实现了.你总是可以像往常一样使用 match 表达式,通常你只需要一个 case,例如List((1,2),(3,4)).map{ case (a,b) =>a*b }.

Having:

def f () = {
    (1, "two", 3.0)
}

Why is it ok

var (x, y, z) = f()

but not


var i = 0
var j = "hello"
var k = 0.0

// use i, j, k
...
//then
(i, j, k) = f() // ; expected but = found

?

解决方案

You see here a limited version of pattern matching when initializing variables. Note that this works not only for tuples:

val a :: b = List(1,2,3)
println(a) //1
println(b) //List(2, 3)

This feature seems to be borrowed directly from Haskell, where you can use patterns for initialization as well:

let (a,b) = getTuple 
in a*b

As Haskell has no mutable data, there is no way to assign something.

In Scala you could do something like this, but I guess this was considered too confusing, or maybe too difficult to implement. You can always use a match expression as usual, and often you need just a case, e.g. List((1,2),(3,4)).map{ case (a,b) => a*b }.

这篇关于Scala 并行赋值仅在声明中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆