Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在下划线表示法中引用同一元素_Scala - Fatal编程技术网

Scala 在下划线表示法中引用同一元素

Scala 在下划线表示法中引用同一元素,scala,Scala,我有下面的类定义和列表 class myclass{ val val1: Int = 1 val val2: Int = 2 ... } val mylist = List(a: myclass, b: myclass, c: myclass, d: myclass) 如何将下一行代码转换为下划线符号 mylist.foldLeft(0)((x,y) => x + y.val1 * y.val2) 我知道下一行行不通: (0 /: mylist)(_ + _.val1 *

我有下面的类定义和列表

class myclass{
  val val1: Int = 1
  val val2: Int = 2
  ...
}
val mylist = List(a: myclass, b: myclass, c: myclass, d: myclass)
如何将下一行代码转换为下划线符号

mylist.foldLeft(0)((x,y) => x + y.val1 * y.val2)
我知道下一行行不通:

(0 /: mylist)(_ + _.val1 * _.val2)
这是因为第一个
是指
x
,第二个是指
y
,但第三个
scala不知道引用了哪个变量,我的问题是,是否有一种方法可以这样做这不太疯狂:

scala> case class C(v: Int, w: Int)
defined class C

scala> val cs = List(C(1,2),C(3,4))
cs: List[C] = List(C(1,2), C(3,4))

scala> cs.iterator.map(c => c.v*c.w).foldLeft(0)(_+_)
res0: Int = 14
它表示操作是独立的。迭代可以避免中间列表。

这并不疯狂:

scala> case class C(v: Int, w: Int)
defined class C

scala> val cs = List(C(1,2),C(3,4))
cs: List[C] = List(C(1,2), C(3,4))

scala> cs.iterator.map(c => c.v*c.w).foldLeft(0)(_+_)
res0: Int = 14

它表示操作是独立的。迭代避免了中间列表。

如果没有(合理的)方法使其与下划线一起工作,该怎么办?也许您可以在
myclass
上引入一个方法
def prod12=val1*val2
,但就是这样……您可以有一个更通用的解决方案来编写
。{x=>x.val1*x.val2}
。为什么要使用下划线符号?-一般来说,最好命名参数以使代码更具可读性,除非函数非常琐碎(事实并非如此)。@LuisMiguelMejíaSuárez有趣的是,
+
很简单。@som snytt我必须同意,
\uu+\uu
是我认为下划线符号有意义的少数几种情况之一。如果没有(合理的)方法使其与下划线一起工作,该怎么办?也许您可以在
myclass
上引入一个方法
def prod12=val1*val2
,但就是这样……您可以有一个更通用的解决方案来编写
。{x=>x.val1*x.val2}
。为什么要使用下划线符号?-一般来说,最好命名参数以使代码更具可读性,除非函数非常琐碎(事实并非如此)。@LuisMiguelMejíaSuárez有趣的是,
+
很简单。@som snytt我必须同意,
\uu+\uu
是我认为下划线符号有意义的少数几种情况之一。我想指出,这种“常见的”映射模式,然后使用一个自然的
值和
组合
函数进行折叠,可以使用Cats/Scalaz上的可折叠类型类的
foldMap
函数进行回复,这也保证了只需一次迭代。我想指出,这是“常见的”映射模式,然后使用一个自然的
值和
组合
函数进行折叠,可以使用Cats/Scalaz上可折叠类型类的
折叠映射
函数进行回复,这也保证了只需一次迭代。