Scala下划线的行为不像列表元素那样工作

时间:2017-10-28 20:44:54

标签: scala

嗨,我是斯卡拉的新手,当然还有一个新手问题, 为什么下划线字符在这种情况下不起作用 在这种情况下,我对下划线的承诺代表了列表中的一个元素

val listOftuple =  List(("cat","tom"),("mouse","jerry"),("dog","spike"))
val listOfarray =  List(Array("cat","tom"),Array("mouse","jerry"),Array("dog","spike"))

tuplelist.map(it=>it._1+it._2) //Ok 
tuplelist.map(_._1+_._2) //Not work, give me: error: missing parameter type for expanded function

listOfarray.map(_.length) //Here work, like array.length
listOfarray.map(it=>it(0)+it(1)) //Ok

listOfarray.map(_=>_(0)+_(1))//Not work, give me: error: missing parameter type for expanded function 
listOfarray.map(_(0)+_(1))//Not work, give me: error: missing parameter type for expanded function 

可能是我陷入了词汇误解? 如何修复错误消息? 问候

1 个答案:

答案 0 :(得分:1)

tuplelist.map(_._1+_._2) 

每次使用_时,它代表另一个参数。也就是说,_ + _相当于(x,y) => x+y,而不是x => x+x。所以上面等同于tuplelist.map((x, y) => _._1 + _._2),这不起作用,因为map期望一个函数只接受一个参数。

listOfarray.map(_=>_(0)+_(1))

使用_作为函数参数的名称只意味着将忽略该参数。在函数体内使用_时,它仍然是函数快捷方式运算符,而不是对被忽略参数的引用。所以上面的lambda相当于ignoredParam => (x, y) => x + y

listOfarray.map(_(0)+_(1))

(x,y) => x(0) + y(1),但您需要x => x(0) + x(1)

  

如何修复错误消息?

在所有这些情况下,使用显式参数列表是正确的解决方案。如果要多次使用相同的参数,则无法使用快捷方式表示法。