2017-04-06 8 views
8

İşte aşağıdaki sorun.Ad-by-tekil kolon operatörünü ve alan tutarsızlığını birleştirin

object Test { 
    def /:(s: => Unit) = { 
    println("/:") 
    s 
    } 
} 

println("A") /: Test 

O yazdırır: Aşağıdaki çalıştırdığınızda

A 
/: 

Ancak, ben yazdırmak için bunu bekliyordum:

/: 
A 

son ifadesi sözde Test./:(println("A")) yeniden yazıldı beri - hangi yol, ikinci değeri verir.

İlk sözdizimi işini yapmanın bir yolu var mı? println("A") /: Test ancak ad-by-ile?

desugar yöntemi kullanarak Düzenleme

, ben aramalar farklı şekeri alınmış öğrendim.

> desugar { println("A") /: Test} 
val x$1: Unit = println("A"); 
Test./:(x$1) 

Bu yüzden neden hala bu seçeneği merak ediyorum.

+1

İfadenin "Test ./ :(println (" A "))' ile eşdeğer olduğunu neden "sanıyorsunuz"? Spesifikasyon şöyle der: "e1 op e2" sola birleştirici bir ikili işlem "e1.op (e2)" olarak yorumlanır. Eğer op 'doğru-birleştirici ise, aynı işlem' val vald = e1; e2.op (x)} ', burada' x' yeni bir isimdir. Yani, {val x = println ("A") karşılığıdır; Test./:(x)}. –

cevap

10

Bu bir known issue olduğunu. -Xlint seçeneği ile derlerseniz, warning'u görmelisiniz.

$ scalac -Xlint temp.scala 
temp.scala:2: warning: by-name parameters will be evaluated eagerly when called 
       as a right-associative infix operator. For more details, see SI-1980. 
    def /:(s: => Unit) = { 
     ^
one warning found 
0

Sorun, sanırım, Unit türünde bir ad parametresi beklediğiniz gerçektir - yalnızca bir birim vardır, bu nedenle ad: ().

aşağıdaki eserlerini bulundu:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

object Test { 
    def /:(s:() => Unit) = { 
    println("/:") 
    s() 
    } 
} 

val p =() => println("A") 
p /: Test 

// Exiting paste mode, now interpreting. 

/: 
A 
defined object Test 
p:() => Unit = <function0> 
res5: Any =() 
+0

Bu çalışmayla bahse girerim, ama sorun Ünite yüzünden değil. Ben '/ Test' satırının sonuna yazabilmeyi ve daha önce basılmış bir şey yazmayı istiyorum. Argümanın kendisini yeniden yazmak istemiyorum. –