Ze znakiem równości:
object HelloWorld {
def main(args: Array[String]) = {
println("Hello!")
}
}
Bez znaku równości:
object HelloWorld {
def main(args: Array[String]) {
println("Hello!")
}
}
Oba powyższe programy działają w ten sam sposób. W poście na blogu Rzeczy, których nie lubię w Scali przeczytałem, że gdy brakuje znaku równości, metoda zwróci Unit
(tak samo jak w Javie void
), więc metody zwracające wartość muszą używać znaku równości. Ale metody, które nie zwracają wartości, można zapisać w dowolny sposób.
Jaka jest najlepsza praktyka dotycząca używania znaku równości w metodach Scala, które nie zwracają wartości?
AKTUALIZACJA: od Scala-2.10 preferowane jest używanie znaku równości. Stara odpowiedź:
Metody, które zwracają,
Unit
powinny zawsze używać składni różnej od równości. Pozwala to uniknąć potencjalnych błędów w implementacji przenoszonych do API. Na przykład mogłeś przypadkowo zrobić coś takiego:object HelloWorld { def main(args: Array[String]) = { println("Hello!") 123 } }
Oczywiście banalny przykład, ale widać, że może to być problem. Ponieważ ostatnie wyrażenie nie zwraca
Unit
, sama metoda będzie miała inny typ zwrotu niżUnit
. Jest to ujawniane w publicznym interfejsie API i może powodować inne problemy w przyszłości. W przypadku składni różnej od równości nie ma znaczenia, jakie jest ostatnie wyrażenie, Scala ustala zwracany typ jakoUnit
.Jest to również czystsze dwie postacie. :-) Wydaje mi się również, że składnia nierówności sprawia, że kod jest trochę łatwiejszy do odczytania. Bardziej oczywiste jest, że dana metoda zwraca
Unit
raczej niż jakąś użyteczną wartość.W związku z tym istnieje analogiczna składnia dla metod abstrakcyjnych:
trait Foo { def bar(s: String) }
Metoda
bar
ma podpisString=>Unit
. Scala robi to, gdy pominiesz adnotację typu na abstrakcyjnym elemencie członkowskim. Po raz kolejny jest to czystsze i (myślę) łatwiejsze do odczytania.źródło
W deklaracjach wywołań należy używać znaku równości, z wyjątkiem definicji zwracających Unit.
W tym ostatnim przypadku, mogą zrzec znak równymi. Ta składnia może być jednak przestarzała, więc najlepiej jej unikać. Używanie znaku równości i deklarowanie zwracanego typu zawsze będzie działać.
źródło
W przypadku metod Scala Style Guide zaleca składnię equals w przeciwieństwie do składni procedury
// don't do this def printBar(bar: Baz) { println(bar) } // write this instead def printBar(bar: Bar): Unit = { println(bar) }
źródło
Jedna rzecz: wyobraź sobie ostatnią instrukcję metody, która powinna zwrócić Unit, nie zwraca Unit. Używanie nierównomiernej składni jest wtedy bardzo wygodne, mam nadzieję, że nie będzie to przestarzałe, ponieważ widzę kilka przypadków użycia tego
źródło
W miarę upływu czasu styl domyślny uległ zmianie, o czym wspomniano w wielu komentarzach do odpowiedzi, dlatego w oficjalnym przewodniku po stylach zaleca się używanie
=
składni do deklaracji funkcji.źródło
w przypadku metody, która nie ma wartości zwracanej, sposobem wyrażenia takich metod jest pominięcie typu wyniku i znaku równości, po metodzie z blokiem zamkniętym w nawiasach klamrowych. W tej formie metoda wygląda jak procedura, metoda, która jest wykonywana tylko z powodu efektów ubocznych.
źródło