10

我可以做类似的事情

def f(): Tuple2[String, Long] = ...
val (a, b) = f()

如果变量已经存在怎么办?我在过滤器上运行相同的数据集,我不想链接它们(长名称等)。这是我尝试过的,但它抱怨期待;而不是 = 在最后一行:

var a = ...initialization for this data
var b = ...some other init
(a, b) = g(a, b) // error: expected ';' but found '='

有没有办法避免中间元组?

4

5 回答 5

14

正如亚历克斯指出的那样,简短的回答是否定的。你的代码是这样的:当ab已经是当前范围内的绑定变量时,(a, b)表示“获取 a 和 b 的值并从中构造一个元组”。

所以,

(a, b) = ...

相当于

(new Tuple2(a, b)) = ...

这显然不是你想要的(除了荒谬之外)。

您想要的语法(一次分配给多个变量的能力)根本不存在。您甚至不能一次将相同的值分配给多个预先存在的变量(在许多其他语言中发现的常用语法“a = b = ...”在 Scala 中不起作用。)我认为这不是偶然的vals 比 vars 获得优惠待遇;他们几乎总是一个更好的主意。

听起来所有这些都发生在某种循环中,并且重复分配。这不是非常惯用的 Scala。我建议您尝试在程序中消除 vars 的使用,并以更实用的方式做事,使用 map、flatMap、filter、foldLeft 等。

于 2010-07-28T00:55:57.207 回答
8

简短的回答:没有。

于 2010-07-27T23:32:21.430 回答
1

它适用于新值,因为该语法被视为模式匹配,就像 case 语句一样。所以,正如亚历克斯所说,你不能这样做。

于 2010-07-28T00:31:57.960 回答
0

我找到的解决方法是这样的:

// declare as var, not val
var x = (1,"hello")  
// x: (Int, String) = (1,hello)

// to access first element
x._1
// res0: Int = 1

// second element
x._2
// res1: String = hello

// now I can re-assign x to something else
x = (2, "world")
// x: (Int, String) = (2,world)

// I can only re-assign into x as long the types match
// the following will fail

x = (3.14, "Hmm Pie")
<console>:8: error: type mismatch;
 found   : Double(3.14)
 required: Int
       x = (3.14, "Hmm Pie")
于 2014-09-21T20:00:10.757 回答
0

如果您总是在过滤器等上运行“相同的数据集”,则表明它们以某种方式属于一起,因此您应该考虑使用元组或专用类(在这种情况下通常是案例类)对它们进行分组。

于 2010-07-28T06:40:29.593 回答