关于扩展Scala方法签名

问题描述:

几个月后,我几乎完全是Scala的新手。我注意到一些野生签名。我已经通过对立/正面/扩展/不变性和大多数基础的泛型工作。但是,我继续发现一些方法签名有点令人困惑。当我找到例子并且知道签名产生的时候,我对于某些功能仍然有点不知所措。谷歌搜索我的问题让我没有答案。我确实有一个总体想法,即人们喜欢击败基本CS 1的东西而死。我甚至试图在scala网站上找到答案。也许我是像“扩展方法签名”和“在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 =>未来[R],以及需要提供的最后一个参数,让我们假装这将是任何隐含的,我需要做更多的东西一样:

futureUsing(resourceOfI)({stuff => doStuff(stuff)})(myImplicit) 

这甚至是否正确?

我可以这样做:

futureUsing(resourceOfI)(myImplicit)({stuff => doStuff(stuff)}) 

为什么?我真的试图找出潜在的原因,而不仅仅是一个二进制是或否。

最后请注意

我刚刚发现这个答案。看来订单不能改变。如果我错了,请纠正我。

Scala: Preference among overloaded methods with implicits, currying and defaults

任何人能解释这个签名?

futureUsing[I <: Closeable, R] 

futureUsing作品具有两个单独类型(2个型参数)。我们不确切知道它们是什么类型,但是我们将调用一个I(输入),它是(或来源于)Closable,另一个R(结果)。

(resourse: I) 

的第一咖喱参数futureUsingI类型。我们将其称为resourse

(f: I => Future[R]) 

第二届令行禁止的说法,f,是一个函数,I类型的参数,并返回一个Future将(最终)含有R类型的东西。

(implicit ec: ExecutionContext) 

第三咖喱参数,ec,是ExecutionContext类型。这个参数是隐含的,这意味着如果在调用futureUsing时没有提供该参数,编译器将查找ExecutionContext,该范围已被声明为implicit,并且将作为第三个参数将其拉入。

:Future[R] 

futureUsing返回Future包含R类型的结果。


是否有一个特定的顺序来呢?

隐式参数必须是最后(最右边)参数。除此之外,否,resoursef可能已按任一顺序进行声明。当被调用时,参数的顺序必须与定义中声明的顺序相匹配。

我需要......暗示拖入吗?

ExecutionContext的情况下,让编译器使用可从import scala.concurrent.ExecutionContext获得的内容。只有在极少数情况下,你需要不同的东西。

...怎么会斯卡拉使用第二咖喱参数...

futureUsing身体我希望看到f(resourse)f需要I类型的参数。 resourse类型为If返回Future[R]所以futureUsing所以行f(resourse)可能是futureUsing正文中的最后一条语句。

+0

所以有一个特定的排序,我明白他们做什么。在初始参数输入后,我是否需要(身体功能摄入量)(暗示拖入)?我可以做例如def futureUsing [E,V](par:E)(implicit ec:ExecutionContext)(f:E => Future [V]):Future [V] = Future {..... Scala会使用第二个curried参数(f:I => Future [R]),而不会将其作为隐式或指定参数。 –