2012-01-04 14 views
6

Jednym z problemów, które ciągle napotykam na scalę, są wyrażenia lambda. Na przykład"Brakujący typ parametru dla funkcji rozszerzonej" podczas używania _ (podkreślenie)?

JarBuilder.findContainingJar(clazz).foreach {userJars = userJars + _ } 

daje mi błąd jak:

missing parameter type for expanded function ((x$1) => userJars.$plus(x$1)) 

Jeśli jednak zrobić ekspansję sobie:

JarBuilder.findContainingJar(clazz).foreach {x => userJars = userJars + x } 

To działa dobrze.

Czy to błąd Scala? Czy robię coś okropnie nie tak?

+1

'_' nie znaczy to, co myślisz, że to oznacza, że ​​nie. Jest to * specjalny * symbol w tym kontekście: * każdy inny prosty identyfikator powinien działać poprawnie *. Z powodu tej magii, 'Some (4) .foreach (_ +: List())' "działa dobrze". Aby zobaczyć, porównaj 'Some (4) .map (_ + 1)' i 'Some (4) .map (x => x + 1)'. Mam nadzieję, że jest to duplikat (i zamknięty jako taki) lub będzie odpowiednia odpowiedź, która ciągnie od SLS :) –

+1

http://stackoverflow.com/questions/7695270/underscore-in-list-filter (good), http : //stackoverflow.com/questions/4422016/scala-underscore-minimal-function, http://stackoverflow.com/questions/6593277/concise-notation-for-single-arg-anonymous-function-avoiding-underscore-not -wor –

+0

(Właściwie to zastanawiam się, czy istnieje * dowolny * kontekst, w którym '_' jest * nie * magiczny w * inny sposób * ...) –

Odpowiedz

6

Używanie składni zastępczej dla funkcji anonimowych jest ograniczone do wyrażeń. W twoim kodzie próbujesz użyć symbolu wieloznacznego w instrukcji przypisania, która nie jest taka sama jak wyrażenie.

Jeśli przyjrzeć się bliżej temu błędowi, można zauważyć, że wyrażenie po prawej stronie zadania jest rozszerzane do postaci anonimowej.

Biorąc pod uwagę to, co staramy się osiągnąć jednak może warto rozważyć następujące

userJars = userJars ++ JarBuilder.findContainingJar(clazz) 
+0

Dzięki, ma sens. Chociaż twoje ++ rozwiązanie nie działa, ponieważ "findContainJar" zwraca opcję [T], a nie listę [T] – Heptic

+0

Opcja powinna być niejawnie przekształcona w Iterable w razie potrzeby. Wydaje się, że działa to w wersji 2.9.0.1 –

Powiązane problemy