Jeśli chcę dodać metodę do klasy w Scala, muszę zrobić coś takiego:Zrozumieć dlaczego „pimp my biblioteki” został zdefiniowany w ten sposób w Scala
class RichFoo(f: Foo) {
def newMethod = f.bar()
}
object RichFoo {
implicit def foo2Rich(f: Foo) = new RichFoo(f)
}
Następnie f.newMethod
spowoduje utworzenie RichFoo
wystąpienie i wywołaj jego metodę.
Próbuję zrozumieć, dlaczego to nie zostało zdefiniowane w sposób podobny do Ruby:
override class Foo {
def newMethod = bar
}
Kompilator może spojrzeć na tej definicji i utworzyć klasę FooOverride metodą statyczną newMethod który pobiera parametr typu Foo i nazywa swoją metodę prętową. W ten sposób Scala wdraża cechy. Nadal muszę zaimportować paczkę zawierającą nadpisanie Foo, aby z niej skorzystać.
Wydaje się, że wymaga mniej pisania, nie wymaga wymyślania nazw i ma lepszą wydajność (bez wywoływania metody i tworzenia obiektu). Wszystko, co niejawna metoda konwersji, można zrobić wewnątrz dodatkowej metody.
Jestem pewien, że coś przeoczyłem i chciałbym dowiedzieć się, co.
Does Ruby naprawdę się wykonać Scala w tym przypadku, czy może spekulować, że otwarta implementacja klasy może być tak szybki jak zamknięty? –
Proponuję elewację, która wygląda tak, jakbyś ponownie otwierała klasę, ale w rzeczywistości po prostu wywołuje metody statyczne. Kompilator scala robi takie rzeczy przez cały czas (cechy są kompilowane do interfejsu i klasy za pomocą metod statycznych). Spekuluję, że jest to mniej kodowane i szybsze w porównaniu do obecnego niejawnego sposobu def. – IttayD