在扩展的Scala方法签名上

时间:2016-09-22 16:41:34

标签: scala function signature

几个月后,我对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

1 个答案:

答案 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

  

这是否有特定的顺序?

隐式参数必须是最后(最右边)参数。除此之外,不能,FutureR可以按任何顺序声明。当然,当调用时,参数的顺序必须与定义中声明的顺序相匹配。

  

我需要拖拽吗?

resourse的情况下,让编译器使用f中提供的内容。只有在极少数情况下你才需要不同的东西。

  

...... Scala如何使用第二个咖喱论证......

ExecutionContext的正文中,我希望看到import scala.concurrent.ExecutionContextfutureUsing采用f(resourse)类型的参数。 f的类型为Iresourse返回If也是如此,因此第Future[R]行可能是futureUsing正文中的最后一个语句。