几个月后,我对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
没有任何排序只是暗示必须是最后的。放置是关于依赖性的,在上面提到的上述答案之一中,如同某人一样从左到右流动。为什么我不能先得到implicits,之后依赖于它们的一切都很奇怪,因为没有任何可用的东西会导致错误,而且事情很可能取决于给定的隐含。
然而,我仍然有点困惑。指定f时:I =&gt; Future [R],并且需要提供最后一个参数,让我们假装它是任何隐含的,我需要做更多的事情:
futureUsing(resourceOfI)({stuff => doStuff(stuff)})(myImplicit)
这是否正确?
我可以这样做:
futureUsing(resourceOfI)(myImplicit)({stuff => doStuff(stuff)})
为什么呢?我真的想要了解潜在的原因,而不仅仅是二元是或否。
最后的注释
我刚刚找到了这个答案。看来订单无法更改。如果我错了,请纠正我。
Scala: Preference among overloaded methods with implicits, currying and defaults
答案 0 :(得分:4)
任何人都可以解释这个签名吗?
futureUsing[I <: Closeable, R]
futureUsing
使用两种不同的类型(两种类型参数)。我们并不确切地知道它们是什么类型,但我们会调用一个I
(输入),它是({派生的)Closable
,另一个{{1 (结果)。
R
(resourse: I)
的第一个参数是#{1}}类型。我们称之为futureUsing
。
I
第二个curried参数resourse
是一个函数,它接受(f: I => Future[R])
类型的参数并返回f
,它将(最终)包含I
类型的某些内容
Future
第3个curried参数R
的类型为(implicit ec: ExecutionContext)
。这个参数是隐含的,这意味着如果在调用ec
时没有提供它,编译器将在已声明为ExecutionContext
的范围内寻找futureUsing
并且它将拉出作为第三个论点。
ExecutionContext
implicit
会返回包含:Future[R]
类型结果的futureUsing
。
这是否有特定的顺序?
隐式参数必须是最后(最右边)参数。除此之外,不能,Future
和R
可以按任何顺序声明。当然,当调用时,参数的顺序必须与定义中声明的顺序相匹配。
我需要拖拽吗?
在resourse
的情况下,让编译器使用f
中提供的内容。只有在极少数情况下你才需要不同的东西。
...... Scala如何使用第二个咖喱论证......
在ExecutionContext
的正文中,我希望看到import scala.concurrent.ExecutionContext
。 futureUsing
采用f(resourse)
类型的参数。 f
的类型为I
。 resourse
返回I
,f
也是如此,因此第Future[R]
行可能是futureUsing
正文中的最后一个语句。