Scala Pętla for z ciałem i yield

Scala Pętla for z ciałem i yield
W5
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 95
0

Cześć :)
Uczę się scali, bawiłem się forem z yield i napisałem taki fragment kodu

Kopiuj
val numList2 = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val x = for(g <- numList2 if g % 3 == 0) yield g {
    println("Something")
}

println(s"\nx = $x")

IntelliJ nie pokazuje żadnego problemu ale podczas kompilacji wywala:
Error:(21, 58) Int does not take parameters val x = for(g <- numList2 if g % 3 == 0) yield g {

Nie da się zrobić pętli która zwróci wyniki i jednocześnie będzie coś robić wewnątrz? Czy może to trzeba inaczej zrobić?

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

Jak pokazuje: https://stackoverflow.com/questions/9796939/scala-yield-syntax
oraz to: https://docs.scala-lang.org/tutorials/FAQ/yield.html
"In Scala, yield is part of for comprehensions – a generalization of Ruby and Python’s list-comprehensions." - czyli za bardzo nie ma sensu blok za yield.

DQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 141
0

Nie do końca nie ma sensu.

Blok za yield może być stosowany i nie ma w tym nic złego. W przypadku z pierwszego posta nie ma sensu ponieważ jest to odczytywane przez kompilator jakbyś próbował do g, który jest Int'em przekazać parametr jak do funkcji. To co chcesz osiągnąć można (zapewne, zależy co chcesz kiedy printować) zrobić na przykład tak:

Kopiuj
val numList2 = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val x = for(g <- numList2 if g % 3 == 0) yield {
    println("Something")
    g
}

println(s"\nx = $x")

lub:

Kopiuj
  val numList2 = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  val x = for {
    g <- numList2
    if g % 3 == 0
    _ = println("Something")
  } yield g
  println(s"\nx = $x")

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.