Quando utilizzare il segno di uguale in una dichiarazione del metodo Scala?


85

Con segno di uguale:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

Senza segno di uguale:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

Entrambi i programmi di cui sopra vengono eseguiti allo stesso modo. Nel post del blog Le cose che non mi piacciono in Scala ho letto che quando manca il segno di uguale, il metodo tornerà Unit(come quello di Java void), quindi i metodi che restituiscono un valore devono usare il segno di uguale. Ma i metodi che non restituiscono un valore possono essere scritti in entrambi i modi.

Qual è la procedura migliore per utilizzare il segno di uguale nei metodi Scala che non restituiscono un valore?

Risposte:


108

In realtà non sono abbastanza d'accordo con Daniel. Penso che la sintassi non uguale non dovrebbe mai essere utilizzata. Se il tuo metodo viene esposto come API e temi di restituire accidentalmente il tipo sbagliato, aggiungi un'annotazione di tipo esplicita:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

La sintassi non uguale è più breve e potrebbe sembrare "più pulita", ma penso che aggiunga solo la possibilità di confusione. A volte ho dimenticato di aggiungere un segno di uguale e credevo che il mio metodo restituisse un valore quando in realtà restituiva Unità. Poiché le sintassi di tipo non uguale e uguale a inferito sono visivamente simili, è facile non notare questo problema.

Anche se mi costa un po 'più di lavoro, preferisco le annotazioni di tipo esplicito quando sono importanti (vale a dire, le interfacce esposte).


1
Mi piace questo approccio, è più esplicito e quindi più chiaro per il lettore.
Lukasz Korzybski

4
Apparentemente questo è lo stile consigliato ( docs.scala-lang.org/style/declarations.html#procedure_syntax ) quindi sto cambiando questo per essere la risposta accettata.
Esko Luontola

1
Sono d'accordo anche con questo, penso che la sintassi senza = dovrebbe essere rimossa del tutto dalla lingua
Ahmed Soliman Farghal

7
Martin Odersky nel suo intervento "Scala with Style" ha detto che è stato un errore storico. Ha dovuto aggiungere questa sintassi (senza =) in modo da poter nascondere "Unit" agli sviluppatori Java in modo che non si confondessero. Inoltre ha detto che sarà rimosso in futuro.
tabdulradi

2
C'è un modo per AVVERTIRE se il segno di uguale è stato dimenticato nella definizione del metodo? Come opzione del compilatore, ad esempio, o in qualsiasi strumento di analisi del codice sorgente?
VasiliNovikov

42

AGGIORNAMENTO: a partire da Scala-2.10, è preferibile utilizzare il segno di uguale. Vecchia risposta:

I metodi che restituiscono Unitdovrebbero sempre utilizzare la sintassi non uguale. Ciò evita che potenziali errori di implementazione vengano trasferiti nell'API. Ad esempio, potresti aver accidentalmente fatto qualcosa del genere:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

Un esempio banale ovviamente, ma puoi vedere come questo potrebbe essere un problema. Poiché l'ultima espressione non viene restituita Unit, il metodo stesso avrà un tipo restituito diverso da Unit. Questo è esposto nell'API pubblica e potrebbe causare altri problemi lungo la strada. Con la sintassi non uguale, non importa quale sia l'ultima espressione, Scala corregge il tipo restituito come Unit.

È anche due personaggi più puliti. :-) Tendo anche a pensare che la sintassi non uguale renda il codice un po 'più facile da leggere. È più ovvio che il metodo in questione restituisce Unitpiuttosto che un valore utile.

In una nota correlata, c'è una sintassi analoga per i metodi astratti:

trait Foo {
  def bar(s: String)
}

Il metodo barha la firma String=>Unit. Scala lo fa quando ometti l'annotazione del tipo su un membro astratto. Ancora una volta, questo è più pulito e (penso) più facile da leggere.


3
Non usare il segno di uguale è anche consigliato nella Scala Style Guide: davetron5000.github.com/scala-style/types/inference/…
Esko Luontola

6
Ho scritto quel pezzo, quindi dovresti probabilmente tenerlo a mente quando pesi il riferimento. :-)
Daniel Spiewak

LoL, quindi ho descritto questo piccolo scambio alla mia ragazza, tranne che per la mia scarsa enunciazione "bit" è uscito come "cagna". Inutile dire che è seguita la commedia.
Saem

10
ScalaDays 2013, Martin Odersky, Keynote - Scala with Style capitolo 45 : la dichiarazione di procedura (sintassi non uguale) dovrebbe essere evitata.
senia

4
La guida stilistica ufficiale non lo consiglia più: docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein

12

È necessario utilizzare le dichiarazioni di chiamata con segno di uguale ad eccezione delle definizioni che restituiscono Unità.

In quest'ultimo caso, si può rinunciare il segno di uguale. Questa sintassi potrebbe essere deprecata, quindi è meglio evitarla. L'utilizzo del segno di uguale e la dichiarazione del tipo restituito funzioneranno sempre.


Libri, mailing list, codice sorgente. A proposito, da quel momento è diventato chiaro che è improbabile che la seconda sintassi sia deprecata ed è preferita da molti.
Daniel C. Sobral

1
docs.scala-lang.org/style/types.html#function_values Sembra che la guida allo stile dei tipi indichi l'uso di = sempre comunque.
BeepDog

4

Per i metodi, Scala Style Guide consiglia la sintassi uguale anziché la sintassi delle procedure

Sintassi della procedura

Evita la sintassi della procedura, poiché tende a creare confusione per un guadagno minimo di brevità.

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

0

Una cosa: immagina che l'ultima affermazione di un metodo che dovrebbe restituire Unit non restituisca Unit. L'utilizzo della sintassi non uguale è quindi molto conveniente, spero che non sia deprecato poiché vedo diversi casi d'uso per questo


0

Con il passare del tempo lo stile predefinito è cambiato, e questo è stato menzionato in molti dei commenti alle risposte, si raccomanda nella guida allo stile ufficiale di usare la =sintassi per le dichiarazioni di funzione.


1
Il collegamento che hai fornito parla solo di funzioni, non di procedure (cioè funzioni che restituiscono Unit).
Esko Luontola

Hai ragione, @EskoLuontola, mi dispiace, probabilmente ho copiato il link sbagliato da una delle tante schede che avevo aperto, è stato aggiornato.
BeepDog

0

per i metodi che non hanno un valore di ritorno, un modo per esprimere tali metodi è tralasciare il tipo di risultato e il segno di uguale, seguendo il metodo con un blocco racchiuso tra parentesi graffe. In questa forma, il metodo sembra una procedura, un metodo che viene eseguito solo per i suoi effetti collaterali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.