Non Scala hanno le protezioni?

Ho iniziato a imparare la scala di un paio di giorni fa e quando l’apprendimento è, mi confronto con altre la programmazione funzionale lingue come (Haskell, Erlang) che avevo una certa familiarità con. Non Scala ha guardia sequenze disponibili?

Sono andato attraverso la corrispondenza di modello in Scala, ma c’è un concetto equivalente ai ripari con otherwise e tutti?



4 Replies
  1. 54

    Sì, si utilizza la parola chiave if. Dal Caso Di Classi Di sezione di Un Tour di Scala, vicino al fondo:

    def isIdentityFun(term: Term): Boolean = term match {
      case Fun(x, Var(y)) if x == y => true
      case _ => false
    }

    (Questo non è menzionato sul Il Pattern Matching pagina, forse perché il Tour è una rapida panoramica.)


    In Haskell, otherwise è in realtà solo una variabile associata a True. In modo da non aggiungere alla potenza del concetto di pattern matching. Si può ottenere solo ripetendo il modello iniziale, senza la guardia:

    //if this is your guarded match
      case Fun(x, Var(y)) if x == y => true
    //and this is your 'otherwise' match
      case Fun(x, Var(y)) if true => false
    //you could just write this:
      case Fun(x, Var(y)) => false
  2. 19

    Sì, ci sono pattern guardie. Sono utilizzati come questo:

    def boundedInt(min:Int, max: Int): Int => Int = {
      case n if n>max => max
      case n if n<min => min
      case n => n
    }

    Notare che invece di un otherwise-clausola, è sufficiente specificare il motivo, senza una guardia.

    • Quale sarà il n in questo caso, e si prega di dare un esempio per il sopra.
    • sarà l’argomento dato alla funzione. Qui‘s un esempio di utilizzo della funzione.
    • Capito, grazie 🙂
  3. 9

    La semplice risposta è no. Non è esattamente quello che stai cercando (una corrispondenza esatta per Haskell sintassi). Utilizzare la Scala del “match” con una guardia, e la fornitura di una wild card, come:

    num match {
        case 0 => "Zero"
        case n if n > -1 =>"Positive number"
        case _ => "Negative number"
    }
  4. 4

    Mi sono imbattuto in questo post cercando come applicare le protezioni in partite con più argomenti, non è molto intuitivo, quindi sono l’aggiunta di un casuale esempio qui.

    def func(x: Int, y: Int): String = (x, y) match {
      case (_, 0) | (0, _)  => "Zero"
      case (x, _) if x > -1 => "Positive number"
      case (_, y) if y <  0 => "Negative number"
      case (_, _) => "Could not classify"
    }
    
    println(func(10,-1))
    println(func(-10,1))
    println(func(-10,0))

Lascia un commento