Groovy Chiusura con argomenti opzionali

Voglio definire una chiusura che prende un argomento (al quale faccio riferimento con it )
a volte ho voglia di passare un altro argomento aggiuntivo per la chiusura.
come posso fare questo?

InformationsquelleAutor Moonlit | 2012-09-25

 

3 Replies
  1. 36

    Si potrebbe impostare il secondo argomento per un valore di default (come null):

    def cl = { a, b=null ->
      if( b != null ) {
        print "Passed $b then "
      }
      println "Called with $a"
    }
    
    cl( 'Tim' )          //prints 'Called with Tim'
    cl( 'Tim', 'Yates' ) //prints 'Passed Yates then Called with Tim

    Un’altra opzione sarebbe quella di fare b un vararg Lista in questo modo:

    def cl = { a, ...b ->
      if( b ) {
        print "Passed $b then "
      }
      println "Called with $a"
    }
    
    cl( 'Tim' )                    //prints 'Called with Tim'
    cl( 'Tim', 'Yates' )           //prints 'Passed [Yates] then Called with Tim
    cl( 'Tim', 'Yates', 'Groovy' ) //prints 'Passed [Yates, Groovy] then Called with Tim
    • è stato facile 😉 thanx
    • nessun problema 🙂 Aggiunto un’altra possibile soluzione
    • E se non si desidera modificare la chiusura del corpo, è possibile denominare il primo argomento ‘e’ 🙂
    • almeno con 2.4.11 predefinito arg viene ignorato e non compilare con @TypeChecked 🙁 – con @TypeChecked(value=TypeCheckingMode.SKIP) funziona di nuovo … stesso con varargs versione
  2. 0

    Varianti da @tim_yates non funzionano con @TypeChecked (in un contesto di classe), almeno con Groovy 2.4.11 in cui il valore predefinito arg viene ignorato e non compilare 🙁

    In modo che altri (certamente più brutto) soluzioni in questo caso sono:

    1. dichiara la chiusura del primo sembra funzionare bene (necessario per ricorsioni comunque):

      def cl
      cl = { ... }
      • almeno in Eclipse Neon /Groovy-Plugin di Eclipse 2.9.2 il completamento del codice/suggerimenti non funzionano, utilizzando la chiusura in seguito nello stesso blocco di codice => quindi niente di perso, per quanto posso dire
    2. con @TypeChecked(value=TypeCheckingMode.SKIP) per entrambi, ma poi si perderebbe il tipo di controllo sul metodo (o di classe, in base a dove mettere)

    3. dichiarare chiusura delegato cl2:

      @TypeChecked
      class Foo { 
      
        static main( String[] args ) {
      
          def cl = { a, b ->
            if( b != null )
              print "Passed $b then "
            println "Called with $a"
          }
          def cl2 = { a -> cl( a, null ) }
      
          cl2( 'Tim' )         //prints 'Called with Tim'
          cl( 'Tim', 'Yates' ) //prints 'Passed Yates then Called with Tim           
        }
      }
    4. trasformare chiusura in classe metodo, ad esempio,

      @TypeChecked
      class Foo { 
      
        cl( a, b=null ) {
          if( b != null )
            print "Passed $b then "
          println "Called with $a"
        }
      
        static main( String[] args ) {
          cl( 'Tim' )          //prints 'Called with Tim'
          cl( 'Tim', 'Yates' ) //prints 'Passed Yates then Called with Tim           
        }
      }

Lascia un commento