Piszę generator kodu, który generuje wyjście Scala.Jak zdefiniować trójskładnikowego operatora w Scali, który zachowuje wiodące tokeny?
Muszę naśladować operatora trójskładnikowego w taki sposób, aby tokeny prowadzące do "?" pozostać nienaruszonym.
np. przekonwertuj wyrażenie c ? p : q
na c something
. Proste if(c) p else q
zawiodło moje kryteria, ponieważ wymaga ono umieszczenia if(
przed .
Moja pierwsza próba (wciąż przy C/P/q jak wyżej)
c match { case(true) => p; case _ => q }
inną opcję znalazłem:
class ternary(val g: Boolean => Any) { def |: (b:Boolean) = g(b) } implicit def autoTernary (g: Boolean => Any): ternary = new ternary(g)
który pozwala mi napisać:
c |: { b: Boolean => if(b) p else q }
Podoba mi się ogólny wygląd drugiej opcji, ale czy jest jakiś sposób, aby ją mniej gadać?
Dzięki
np. coś używającego "_" zamiast b: Boolean byłoby miłe, ale nie mogłem uzyskać niczego, aby zadziałało poprawnie –
Zobacz 'BooleanW #?' od Scalaz: http://scalaz.googlecode.com/svn/continuous/latest /browse.sxr/scalaz/BooleanW.scala.html – retronym