【发布时间】:2017-01-31 08:33:38
【问题描述】:
几个月后,我对 Scala 几乎完全陌生。我注意到一些狂野的签名。我已经研究过具有对立/共正/扩展/不变性的泛型,以及大多数基础知识。但是,我继续发现一些方法签名有点令人困惑。虽然我找到了示例并知道签名产生了什么,但对于某些功能,我仍然有点茫然。谷歌搜索我的问题让我没有答案。我确实有一个普遍的想法,即人们喜欢将基本的 CS 1 东西打死。我什至试图在 scala 网站上找到答案。也许我的措辞像“扩展的方法签名”和“在 Scala 签名中定义函数使用”是错误的。谁能解释一下这个签名?
futureUsing[I <: Closeable, R](resource: I)(f: I => Future[R])(implicit ec: ExecutionContext):Future[R]
我的猜测是,在初始泛型和带有类型 I 参数的参数声明之后,定义了主体,最后部分是特定于函数或必须在隐式范围内查找的任何对象(它们是否被销毁然后?)。任何人都可以布局扩展的方法签名,以便我知道我正在使用什么代码吗?最后两部分是否有特定的顺序?
注意
经过大量搜索,我找到了一些可以汇总的有效回复:
-Scala - Currying and default arguments
-why in Scala a function type needs to be passed in separate group of arguments into a function
没有固定的顺序,只是隐含必须在最后。放置是关于从左到右流动的依赖关系,正如在上述答案之一中指出的那样。为什么我不能先有隐式,然后一切都依赖于它们,这很奇怪,因为没有可用的东西会导致错误,而且事情很可能取决于给定的隐式。
但是,我仍然有点困惑。当指定 f: I => Future[R] 并需要提供最后一个参数时,假设它是任何隐含的,我是否需要做更多类似的事情:
futureUsing(resourceOfI)({stuff => doStuff(stuff)})(myImplicit)
这是否正确?
我可以这样做:
futureUsing(resourceOfI)(myImplicit)({stuff => doStuff(stuff)})
为什么?我真的想了解根本原因,而不仅仅是二进制是或否。
最后说明
我刚刚找到了这个答案。似乎无法更改顺序。如果我错了,请纠正我。
Scala: Preference among overloaded methods with implicits, currying and defaults
【问题讨论】: