[英]Implicit conversions, type parameters, overloading, and anonymous functions syntax
所以,我試圖用這樣的東西“拉皮條”我的Future
(以及其他東西):
implicit class Pimp[T](val x: T) extends AnyVal {
def ->>[R](f: T => R): R = f(x)
def ->>[R](r: => R): R = r
def <<-(f: T => Unit): T = f.andThen(_ => x).apply(x)
def <<-(f: => Unit): T = <<- { _ => f }
}
出於某種原因,當我現在嘗試這樣做時:
Future(1) ->> { Await.result(_, 1 seconds) }
它失敗並error: missing parameter type for expanded function ((x$1) => Await.result(x$1, 1.seconds))
但這有效:
Future(1) <<- { Await.result(_, 1 seconds) }
所以,問題是第一種情況出了什么問題。 我做錯了什么,以及如何讓它發揮作用。 我甚至試過這個(根本不是我想要的,因為它太冗長了): Future(1) --> { case x: Future[Int] => Awayt.result(_, 1 seconds) }
,但是由於某種原因,這個失敗了(仍然說參數類型未知 - 如果我明確指定它,它怎么知道?)
我懷疑,第一種情況和第二種情況之間的區別在於->>
有一個類型參數,而<<-
沒有......但即使是這個Future(1) ->>[Int] { Await.result(_, 1 seconds) }
仍然無法正常工作:(
更新好了,所以,我找到了一種方法:
Future(1) ->> { (f:Future[Int]) => Await.result(f, 1 seconds) }
這有點失敗了我隱含的目的,因為它是多么冗長:(有沒有辦法讓它推斷參數類型而不像其他情況那樣拼寫出來?
更新2還有一件事。 從Pimp
刪除->>
的重載“味道”使得另一種情況起作用。 即,如果我只離開
def ->>[R](f: T => R): R = f(x)
在Pimp
的定義中,那么
Future(1) ->> { Await.result(_, 1 seconds) }
精美的工作方式。
考慮一下,我想,問題是在重載的情況下foo ->> { _ => bar }
是不明確的:它可能意味着“返回欄”,或者“返回一個函數foo => bar ”。 這並不能解釋為什么foo ->>[Bar] { _ => bar }
不起作用。
您可以縮短對Future(1) ->> { Await.result(_: Future[Int], 1 seconds) }
的調用。 不完美,但比你的更新1更好。更好的是避免在“拉皮條”方法中超載:不出所料,它使類型推斷變得復雜。
看完后http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html仔細,似乎指明[Int]
不應該工作:
整個表達式是函數應用程序(6.6)。
由於Future(1).->>
超載,我們轉到6.23。
備選方案A集是由->>
引用的成員集; [Int]
沒有被考慮在內,因為該部分討論“標識符或選擇e
”,並且選擇是Future(1).->>
。
shape({ Await.result(_, 1 seconds) })
是Any => Nothing
。
“設B是A中適用於類型(形狀(e1),...,形狀(en))”的表達式(e1,...,en)的替代集合。 A 中的兩種方法都適用於Any => Nothing
(如你所說,“它可能意味着”返回欄“或”返回函數foo => bar“)。所以我們去”否則,讓S1,...,Sm是通過鍵入具有未定義的期望類型的每個參數獲得的類型的向量“並且此類型輸入失敗。
對於<<-
case, => Unit
不適用(因為在此步驟中期望的類型不是Unit
,因此不會丟棄值)。
但它足夠微妙,我在寫這個更新時改變了主意兩次; 我想我現在已經做到了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.