27 Stimmen

Fragen zu Scala von einem Rubyisten

Ich habe mich kürzlich umgesehen, um in meiner Freizeit eine neue Sprache zu lernen, und Scala scheint sehr attraktiv zu sein.

Ich habe ein paar Fragen dazu:

  1. Wird die Nichtkenntnis von Java eine eine Herausforderung beim Erlernen von Java? Wird es ein ein großer Nachteil später sein? ( z.B. Wie oft sind die Leute auf Java-spezifischen Bibliotheken? )

  2. Wie groß der Unterschied ist im Vergleich zu Ruby? (Abgesehen davon, dass es statisch typisiert) Führt es eine Menge neuer Begriffe ein, oder werde ich mit den meisten Mechanismen der Sprache Mechanismen der Sprache vertraut sein?

  3. Welche Ressourcen würden Sie empfehlen? Ich habe ein Auge auf Programming Scala y Beginning Scala Bücher

  4. Es ist zwar subjektiv, aber macht es Spaß, in Scala zu programmieren? : P

Gracias

36voto

retronym Punkte 54220

Es gibt viele Konzepte, die Ruby und Scala gemeinsam haben. Es ist schon eine Weile her, seit ich Ruby programmiert habe, daher ist dies nicht vollständig.

Ruby <==> Scala (annähernd!)

  • Mixins <==> Traits
  • Monkey Parcheando <==> Pimp My Library (Implizite Konvertierungen in einen Wrapper mit zusätzlichen Methoden)
  • Proc/Verschluss <==> Funktion/Funktionsliteral
  • Duck Typing <==> Strukturelle Typen
  • Letztes Argument als Proc <==> Curried Parameter List (siehe Traversable#flatMap)
  • Aufzählbar <==> Durchquerbar
  • sammeln <==> Karte
  • inject <==> foldLeft/foldRight
  • Symbol.toProc <==> Syntaktischer Zucker als Platzhalter: people.map(_.name)
  • Dynamische Typisierung - Prägnanz <==> Typinferenz
  • Nil <==> Null, obwohl Option vorzuziehen ist. ( Nicht Nil, was eine leere Liste ist!)
  • Alles ist ein Ausdruck <==> dito
  • Symbole/Hashes als Argumente <==> Benannte und Standardparameter
  • Singleton <==> object Foo {}
  • Alles ist ein Objekt <==> Alles ist ein Typ oder ein Objekt (einschließlich Funktionen)
  • Keine Primitive <==> Einheitliches Typsystem, Any ist Supertyp für Primitive und Objekte.
  • Alles ist eine Nachricht <==> Operatoren sind nur Methodenaufrufe

Ruby's Funktionen, die Sie vielleicht vermissen

  • methode_fehlt
  • define_method etc

Scala-Funktionen, die Sie lernen sollten

  • Abgleich von Mustern
  • Unveränderliche Klassen, insbesondere Case-Klassen
  • Implizite Ansichten und implizite Parameter
  • Typen, Typen, und noch mehr Typen: Generika, Varianz, abstrakte Typenmitglieder
  • Vereinheitlichung von Objekten und Funktionen, besondere Bedeutung von apply y update Methoden.

19voto

Daniel C. Sobral Punkte 290004

Hier ist meine Meinung dazu:

  • Es macht nichts, dass ich Java nicht kenne.

  • Scala stützt sich in hohem Maße auf Java-Bibliotheken. Das spielt überhaupt keine Rolle. Sie werden vielleicht Probleme haben, einige Beispiele zu lesen, aber nicht genug, um ein Hindernis zu sein. Mit etwas Zeit werden Sie nicht einmal den Unterschied zwischen einer Java-API-Dokumentation und einer Scala-API-Dokumentation bemerken (abgesehen von dem völlig anderen Stil der neuesten Scaladoc).

    Die Vertrautheit mit der JVM-Umgebung wird jedoch oft vorausgesetzt. Wenn ich hier einen Rat geben darf, dann den, Maven zunächst zu vermeiden und stattdessen SBT als Bauwerkzeug. Es wird für kleine Programme unnötig sein, aber es wird viele der Macken in der Java-Lang-Welt einfacher zu handhaben machen. Sobald Sie eine externe Bibliothek benötigen, sollten Sie sich mit SBT vertraut machen. Mit ihr müssen Sie sich nicht mit XML befassen: Sie schreiben Ihre Build-Regeln in Scala selbst.

  • Vielleicht fällt es Ihnen schwer, die Begriffe und Konzepte zu verstehen. Scala ist nicht nur statisch typisiert, sondern hat auch eines der leistungsstärksten Typsysteme für nicht-akademische Sprachen, die es gibt. Ich wette, dass dies die Quelle der größten Schwierigkeiten für Sie sein wird. Andere Konzepte haben eine andere Terminologie, aber Sie werden schnell Parallelen zu Ruby ziehen.

    Das ist aber keine große Hürde - Sie können sie überwinden, wenn Sie wollen. Der größte Nachteil ist, dass Sie wahrscheinlich jede andere statisch typisierte Sprache, die Sie danach lernen, als schwerfällig und begrenzt empfinden werden.

  • Sie haben nicht erwähnt, dass die Scala programmieren, auf das Sie ein Auge geworfen haben. Es gibt zwei, plus ein Programmieren in Scala. Letzteres wurde u.a. vom Schöpfer der Sprache geschrieben und gilt weithin als ausgezeichnetes Buch, wenn auch vielleicht etwas langsam. Eines der Programming Scala wurde von einem Twitter-Mitarbeiter - Alex Payne - und von Dean Wampler von Ex-Object Mentor geschrieben. Auch das ist ein sehr gutes Buch. Beginning Scala wurde vom Schöpfer von Lift, David Pollack, geschrieben, und die Leute haben auch gute Dinge darüber gesagt. Ich habe noch niemanden gehört, der beschweren über eines der Scala-Bücher, in der Tat.

    Eines dieser Bücher wäre sicherlich hilfreich. Außerdem ist die Unterstützung auf Stack Overflow für Scala-Fragen ziemlich gut - ich tue mein Bestes, um dies sicherzustellen! :-) Es gibt die scala-users Mailingliste, wo man ebenfalls Antworten bekommen kann (solange die Leute nicht sehr beschäftigt sind), und es gibt den #scala IRC-Kanal auf Freenode, wo man ebenfalls gute Unterstützung bekommt. Manchmal sind die Leute einfach nicht da, aber wenn sie da sind, werden sie dir helfen.

    Schließlich gibt es noch Blogs. Der beste für Anfänger ist wahrscheinlich Tägliche Scala . Sie können viele, viele andere finden sind Planet Scala . Darunter meine eigene Algorithmisch herausgefordert die in letzter Zeit nicht viel Beachtung gefunden hat, aber ich werde darauf zurückkommen :-)

  • Scala hat den Spaß am Programmieren für mich wiederhergestellt. Natürlich habe ich vorher Java gemacht, was imho langweilig ist. Ein Grund, warum ich so viel Zeit mit der Beantwortung von Stack Overflow-Fragen verbringe, ist, dass ich genießen Sie Erarbeitung von Lösungen für die gestellten Fragen.

8voto

oxbow_lakes Punkte 131223

Ich möchte einen Hinweis darauf geben, wie viel Java-Kenntnisse erforderlich sind, denn ich bin nicht der Meinung, dass dies überhaupt kein Thema ist. Es gibt Dinge über Java, die für Scala direkt relevant sind und die Sie verstehen sollten.

  1. En Java-Speicher-Modell und welche Mechanismen die Plattform für Gleichzeitigkeit bietet. Ich spreche von Synchronisierung, Threads usw.

  2. Der Unterschied zwischen primitive Typen (double, float usw.) und Referenztypen (d.h. Unterklassen von Object ). Scala bietet einige nette Mechanismen, um dies vor dem Entwickler zu verbergen, aber es ist sehr wichtig, wenn man Code schreibt, der performant sein muss, zu wissen, wie diese funktionieren

Das gilt für beide Seiten: Die Java-Laufzeitumgebung bietet Funktionen, die (ich vermute, auch wenn ich mich irren kann) in Ruby nicht verfügbar sind und die für Sie von großem Nutzen sein werden:

  • Verwaltungserweiterungen (MBeans)
  • JConsole (für die Laufzeitüberwachung von Speicher, CPU, Debugging von Gleichzeitigkeitsproblemen)
  • JVisualVM (für die Laufzeitinstrumentierung von Code zur Fehlersuche bei Speicher- und Leistungsproblemen)

Die Punkte 1 und 2 sind keine unüberwindbaren Hindernisse, und ich denke, dass die anderen hier erwähnten Gemeinsamkeiten stark zu Ihren Gunsten ausfallen werden. Oh, und Scala macht ganz sicher eine Menge Spaß!

7voto

Malax Punkte 9176

Ich habe zwar keinen Ruby-Hintergrund, aber vielleicht kann ich Ihnen trotzdem weiterhelfen.

  1. Ich glaube nicht, dass Java-Kenntnisse ein Nachteil sind, aber es könnte hilfreich sein. Meiner Meinung nach werden Java-Bibliotheken relativ häufig verwendet, aber selbst ein ausgebildeter Java-Programmierer kennt sie nicht alle, also keine Nachteil hier. Sie werden einige Teile der Java-Bibliothek lernen, indem Sie Scala lernen, weil auch die Scala-Bibliotheken sie benutzen.

  2. --

  3. Ich begann mit der Lektüre von Programming Scala und drehte sich um, um den Quellcode der Scala-Bibliothek zu lesen. Letzteres hat mir sehr geholfen, die Sprache zu verstehen. Und wie immer: Code, Code, Code. Lesen ohne zu programmieren bringt nichts, aber das wissen Sie sicher schon :-) Eine weitere hilfreiche Quelle sind Blogs, siehe https://stackoverflow.com/questions/1445003/what-scala-blogs-do-you-regularly-follow für eine Zusammenstellung von guten Scala-Blogs.

  4. Das ist es! Wie Sie schon sagten, ist das sehr subjektiv. Aber für mich, der ich von einem Java-Hintergrund komme, ist es eine Menge Spaß.

3voto

Urban Vagabond Punkte 6696

Es ist sehr spät, aber ich stimme bis zu einem gewissen Grad mit dem überein, was oxbow_lakes sagte. Ich habe vor kurzem von Python zu Scala übergegangen, und zu wissen, wie Java funktioniert - insbesondere Java Einschränkungen in Bezug auf generische Typen - hat mir geholfen, bestimmte Aspekte von Scala zu verstehen.

Am auffälligsten:

  1. Java hat eine schreckliche Fehlfunktion, die als "type erasure" bekannt ist. Diese Unzulänglichkeit ist leider auch in der JVM vorhanden. Dies betrifft insbesondere die Programmierung mit generischen Typen - ein Problem, das in dynamisch typisierten Sprachen wie Ruby und Python überhaupt nicht auftritt, in statisch typisierten Sprachen aber sehr groß ist. Scala kann dieses Problem so gut wie möglich umgehen, aber das Ausmaß des Bruchs bedeutet, dass einiges davon unweigerlich in Scala durchschlägt. Darüber hinaus sind einige der Korrekturen in Scala für dieses Problem (z.B. Manifeste) neu und hakelig, und erfordern wirklich ein Verständnis dessen, was darunter passiert. Beachten Sie, dass dieses Problem Ihr Verständnis von Scala anfangs wahrscheinlich nicht beeinträchtigen wird, aber Sie werden damit konfrontiert werden, wenn Sie anfangen, echte Programme zu schreiben, die generische Typen verwenden, da es Dinge gibt, die Sie versuchen werden zu tun, die einfach nicht funktionieren, und Sie werden nicht wissen, warum, bis Sie die Beschränkungen verstehen, die durch die Typenlöschung erzwungen werden.

  2. Früher oder später werden Sie auch auf Probleme stoßen, die mit einem anderen Fehler von Java zusammenhängen, nämlich der Aufteilung der Typen in Objekte (Klassen) und primitive Typen (ints, floats, booleans) - und insbesondere der Tatsache, dass primitive Typen nicht Teil des Objektsystems sind. Scala versteckt dies sehr gut vor Ihnen, aber es kann hilfreich sein, zu wissen, was Java in bestimmten Eckfällen tut, die ansonsten schwierig sein könnten -- insbesondere wenn es um generische Typen geht, vor allem wegen der in #1 beschriebenen Unzulänglichkeit der Typenlöschung. (Typ-Löschung führt auch zu einem großen Leistungseinbruch bei der Verwendung von Arrays, Hash-Tabellen und ähnlichen generischen Typen anstelle von Primitiven; dies ist ein Bereich, in dem Java-Kenntnisse sehr hilfreich sind.)

  3. Fehlfunktion Nr. 3: Arrays werden auch in Java speziell und nicht orthogonal behandelt. Scala versteckt dies nicht ganz so nahtlos wie bei den Primitiven, aber viel besser als bei der Typ-Löschung. Der Versteckmechanismus wird manchmal offengelegt (z.B. der ArrayWrapper-Typ), was gelegentlich zu Problemen führen kann -- aber das größte Problem in der Praxis ist, nicht überraschend, wieder mit generischen Typen.

  4. Scala-Klassenparameter und die Art und Weise, wie Scala mit Klassenkonstruktoren umgeht. In diesem Fall ist Java nicht kaputt. Scala wohl auch nicht, aber die Art und Weise, wie es mit Klassenkonstruktoren umgeht, ist eher ungewöhnlich, und in der Praxis hatte ich Schwierigkeiten, sie zu verstehen. Ich war nur in der Lage, das Verhalten von Scala zu verstehen, indem ich herausfand, wie der relevante Scala-Code in Java (oder besser gesagt, in kompiliertes Java) übersetzt wird, und dann überlegte, was Java tun würde. Da ich davon ausgehe, dass Ruby in dieser Hinsicht ähnlich wie Java funktioniert, glaube ich nicht, dass Sie auf allzu viele Probleme stoßen werden, auch wenn Sie vielleicht die gleiche mentale Umwandlung vornehmen müssen.

  5. E/A. Dies ist eher ein Problem der Bibliothek als ein Problem der Sprache. In den meisten Fällen bietet Scala seine eigenen Bibliotheken, aber Scala hat nicht wirklich eine E/A-Bibliothek, so dass Sie so ziemlich keine andere Wahl haben, als die E/A-Bibliothek von Java direkt zu verwenden. Für einen Python- oder Ruby-Programmierer ist diese Umstellung etwas schmerzhaft, da Javas E/A-Bibliothek groß und sperrig ist und für einfache Aufgaben, wie z. B. das Iterieren über alle Zeilen einer Datei, nicht sonderlich einfach zu verwenden ist.

Beachten Sie, dass Sie neben E/A auch Java-Bibliotheken direkt für andere Fälle verwenden müssen, in denen Sie mit dem Betriebssystem oder verwandten Aufgaben interagieren, z. B. bei der Arbeit mit Zeiten und Daten oder beim Abrufen von Umgebungsvariablen, aber das ist normalerweise nicht allzu schwer herauszufinden. Die anderen wichtigen Java-Bibliotheken, die Sie möglicherweise verwenden müssen, sind

  1. Aufruf von Unterprozessen, auch etwas groß und sperrig
  2. Networking - aber das ist immer etwas mühsam
  3. Reflexion, d.h. die dynamische Untersuchung der Methoden und/oder Felder einer Klasse oder der dynamische Aufruf einer Methode nach Namen, wenn der Name zur Kompilierzeit nicht bekannt ist. Dies ist etwas esoterisches Zeug, mit dem die meisten Leute nichts zu tun haben müssen. Anscheinend wird Scala 2.10 eine eigene Reflection-Bibliothek haben, aber derzeit muss man die Java-Reflection-APIs verwenden, was bedeutet, dass man eine ganze Menge darüber wissen muss, wie Scala nach Java konvertiert wird. (Glücklicherweise gibt es eine -print-Option für den Scala-Compiler, die genau zeigt, wie diese Konvertierung erfolgt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X