Jedną ze świetnych i unikalnych cech języka Scala, której PHP nie posiada są tzw implicit conversions zwane też przez oficjalną dokumentację „widokami” (views). Podobny mechanizm zaimplementowany jest w C#, chociaż szczegółów szczerze powiedziawszy nie znam
.Przejdźmy jednak do rzeczy. Czym jest widok/implicit conversion ? Jest to technika niejawnego rzutowania za pomocą funkcji zdefiniowanej przez użytkownika. Przydaje się ona gdy chcemy np. rozszerzyć wbudowaną w język klasę o swoje metody. Funkcję konwertującą definiujemy poprzez dodanie słowa kluczowego „implicit” przed deklaracją funkcji.
Poniżej przykład implicit conversion na wbudowanej klasie „String”, dzięki któremu dodajemy do niej znaną z PHP metodę „stripslashes”:
Najpierw definiujemy nową klasę stringów nazwaną „MyString”:
class MyString(val value: String){
def stripslashes():String = {
return this.value.replace("\\\\","")
}
}
Następnie definiujemy funkcję konwertującą:
implicit def stringToMyString(string: String) = new MyString(string)
Czas na testy. Najpierw klasycznie, bez użycia widoku:
val test1 = new MyString(" aaa \\\\ ");
println(test1.stripslashes) //wyświetli aaa
Z użyciem widoku:
val test2 = " aaa \\\\ "
println(test2.stripslashes) //wyświetli aaa
Jak widać, dzięki technice widoków możemy łatwo wzbogacać wbudowane typy (i nie tylko) o nowe funkcjonalności, czyniąc kod bardziej przyjaznym. Zasięg implicit conversion jest zależny od kontekstu w jakim został zdefiniowany – jeżeli zdefiniujemy go klasie to ma zasięg do klasy, jeżeli w paczce to do paczki.
Technika implicit conversion jest w pewnym stopniu podobna do zgłoszonego kiedyś do PHP ficzeru zwanego autoboxingingiem, z tą różnicą, że mechanizm implicit conversions jest mniej „magiczny” oraz ma wyraźne granice zasięgu działania. Uważam, że jest również lepszy od otwierania klas znanego z języka Ruby, oraz Javascriptowego przyłączania metod do prototypu, z powodów takich samych jak wymienione wcześniej.
A wy co o tym sądzicie ?