在 Scala 中将成员函数调用与其他函数调用相结合的惯用方式是什么?[复制]

What is the idiomatic way to combine member function calls with other function calls in Scala? [duplicate]

提问人:Matei 提问时间:3/30/2023 更新时间:3/31/2023 访问量:74

问:

假设我们在 Scala 中有一个对象(例如一个列表),并且我们希望将用户定义的函数与对象成员函数进行排序,例如:

g(l.map(f)
   .foldRight(...))
 .map(h)

如果函数序列较大,代码就会变得有点混乱。有没有更好的方法来编写这样的代码?也许是这样的:

l.map(f)
 .foldRight(...)
 .call(g)   // call would simply call function g on the resulting object
 .map(h)
Scala 函数 组合 方法-调用 排序

评论

1赞 Luis Miguel Mejía Suárez 3/30/2023
真是太可惜了,必须进口,为此我几乎从不使用它。pipe
1赞 gatear 3/30/2023
如果您使用较旧的 Scala 版本并想实现自己的 Scala 版本,请查看实现: github.com/scala/scala/blob/2.13.x/src/library/scala/util/...pipe
1赞 Mateusz Kubuszok 3/31/2023
@LuisMiguelMejíaSuárez(AFAIK 适用于 2.13 和 3)。scalacOptions += "-Yimports:java.lang,scala,scala.Predef,scala.util.chaining"
0赞 Luis Miguel Mejía Suárez 3/31/2023
@MateuszKubuszok这只会让我的代码在没有 SBT 修补的情况下无法复制到其他项目。我什至不会对我在每个文件中导入的的东西这样做,我不会对我每个蓝月亮都需要的操作员这样做。
1赞 Mateusz Kubuszok 3/31/2023
从技术上讲,你在公司项目上所做的几乎一半的事情都会使代码“不可复制”:添加带有自定义选项的构建工具插件、公司内部的工件、具有自己的类型和别名的自定义 Predef/preludes、在导入时重命名内容、启用 kind 投影仪语法或 Scala 3 交叉编译兼容性......就我个人而言,我几乎不需要将大量内容从一个项目复制粘贴到另一个项目。如果我需要经常这样做,我会考虑将该功能转换为库。YMMV公司

答:

2赞 Dmytro Mitin 3/31/2023 #1

使用可以重写scala.util.chaining._

trait A
trait B
trait C
trait D
trait E
val l:  List[A]      = ???
val f:  A => B       = ???
val z:  C            = ???
val op: (B, C) => C  = ???
val g:  C => List[D] = ???
val h:  D => E       = ???
g(l.map(f)
  .foldRight(z)(op))
.map(h)

import scala.util.chaining._

l.map(f)
  .foldRight(z)(op)
  .pipe(g)
  .map(h)

https://github.com/scala/scala/blob/v2.13.10/src/library/scala/util/ChainingOps.scala

https://blog.knoldus.com/new-chaining-operations-in-scala-2-13/

https://alvinalexander.com/scala/scala-2.13-pipe-tap-chaining-operations/