簡體   English   中英

對call-by-name參數的Scala隱式轉換的工作方式不同,具體取決於函數是否過載

[英]Scala implicit conversion on call-by-name parameter works differently depending on the function is overloaded or not

我們來看下面的代碼:

import scala.language.implicitConversions
class Foo
implicit def int2Foo(a: => Int): Foo = new Foo
def bar(foo: Foo) = {}
def bar(foo: Boolean) = {}
bar {
  println("Hello")
  64
}

此代碼不會打印任何內容,因為該塊包含被視為=> Int println("Hello")並且它被int2Foo轉換為Foo 但是如果我們省略重載的函數bar(foo: Boolean)就會發生令人驚訝的事情

import scala.language.implicitConversions
class Foo
implicit def int2Foo(a: => Int): Foo = new Foo
def bar(foo: Foo) = {}
bar {
  println("Hello")
  64
}

這將打印Hello因為它會對塊進行求值,並且只有最后一個語句(在本例中為64被視為按名稱調用參數。 我無法理解這種差異背后存在什么樣的理由。

我認為Scala規范在如何應用隱式視圖方面不明確。 換句話說,該陳述的以下兩種解釋都符合規范:

bar { println("Hello"); int2Foo(64) }
bar { int2Foo({ println("Hello"); 64 }) }

當然,對於不相關的重載會影響這種行為,這是非常違反直覺的。 在我看來,這種行為雖然含糊不清,但至少應該是一致的。 這必須是重載解析,按名稱參數和隱式視圖之間的編譯器交互的實現細節。 我已經提交了SI-9386來解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM