2009-11-28 5 views
12

Ich habe in den letzten Tagen viel über Ruby gelesen. Bei jedem SO-Post, auf den ich stoße, höre ich, dass Rubin eine elegante Sprache ist. Können Sie uns ein Beispiel geben, warum Ruby elegant ist verglichen mit einer anderen Sprache?Was macht Ruby zu einer eleganten Sprache?

+0

Ähnlich: http://stackoverflow.com/questions/1589841/was-does-it-mean-when-someone-says-that-perl-is-more-expressive-lanaguage –

Antwort

17

Es ist als elegant, weil es orthogonal. Das ist eine nette Art zu sagen, dass ähnliche Operationen für ähnliche Operanden gelten.

Einfaches Beispiel: + auf Ganzzahlen fügt sie hinzu; auf Fließkommazahlen, dito. Auch auf großen Zahlen. Auf Strings verkettet es sie (was Sie auch erwarten würden). Jetzt ist das keine große Sache für +, erwarten Sie es irgendwie von jeder anständigen Programmiersprache. Aber es gibt Operationen wie map oder filter, sie arbeiten auf Listen (sie sollten!), Aber sie funktionieren auch auf Arrays und tatsächlich auf allem, was aufgezählt oder iteriert werden kann.

Ich mag, wie Array (oder Liste) Indizierung funktioniert, können Sie positive Ganzzahl-Indizes von Anfang an indexieren, oder negative Indizes, um eine Position zurück vom Ende der Struktur anzugeben, können Sie einen Bereich angeben, um herauszuziehen eine Teilmenge ... das funktioniert auch für Listen, Arrays und (Sub-) Strings. Es funktioniert auf der rechten Seite einer Zuweisung (=), es funktioniert auch auf der linken Seite (Sie können einem Teilstring zuweisen und somit einen Teil eines Strings ersetzen). Sie brauchen also keine substring_replace Funktion, Sie nutzen einfach ein bestehendes, allgemeines Konzept. Der Autor von Ruby drückte dies in Bezug auf die Erfüllung der Erwartungen des Benutzers (dh des Programmierers) aus: Es sollte so wenig Überraschungen wie möglich geben, wann immer der gesunde Menschenverstand erwarten würde, dass etwas auf eine bestimmte Art und Weise funktioniert sollte. Er hat sehr hart gearbeitet, um diese Anforderung zu erfüllen. Auch wenn Ruby sich ein wenig von Perl ausborgt, stimmt der Autor mit Perls TMTOWTDI-Prinzip zugunsten des Zen von Python nicht überein: "Es sollte einen geben – und vorzugsweise nur einen – offensichtlichen Weg, es zu tun."

Es ist auch schön, dass Ruby Schließungen (= Codeblöcke) macht, so dass Sie eine Funktion einfach durch Umhüllen in eine Klammer angeben können. Es gibt Orte, wo es angebracht ist, eine Funktion inline zu spezifizieren, und Ruby lässt Sie es bequem tun.

Mit Ruby können Sie Dinge mit einer kleinen Menge an Coding machen, weil seine Konstrukte auf kraftvolle Weise zusammenpassen. Ich dabble in Project Euler und ich finde, dass oft die kürzesten lesbar und verständlich Lösungen in Ruby getan wurden.Die kürzesten sind in J, aber das ist ein APL-Dialekt und für den Uneingeweihten sieht es wie Linienrauschen aus.

Meine persönliche Erfahrung bestätigt dies: Ich habe mir selbst Ruby und Rails beigebracht und in einer Woche eine Web-Applikation mit mittelkomplexer Datenanalyse geschrieben. Jedes Prinzip, das ich gelernt habe, könnte ich an verschiedenen Orten mit unterschiedlichen Daten anwenden – Es funktioniert einfach ™!

+0

HAFTUNGSAUSSCHLUSS: Ich könnte in Details über meine obige Antwort unscharf sein, da ich Ruby gerade nicht aktiv benutze. Wenn ich etwas falsch gemacht habe, lass es mich wissen und ich werde es reparieren. Ich liebte Ruby vor einigen Jahren wegen der besagten Eleganz, wurde aber abgewiesen, weil die Referenzimplementierung Hund langsam war. Inzwischen gibt es JRuby, ungefähr so ​​schnell wie Java, und ich würde das für mein nächstes Projekt in Erwägung ziehen. –

+4

Orthogonal in einem Computerkontext bedeutet frei von Nebenwirkungen, so dass zum Beispiel das Modifizieren einer Komponente keine abhängigen Komponenten beeinflusst. –

+1

Aus Wikipedia: "Ein Befehlssatz wird als orthogonal bezeichnet, wenn ein Befehl ein beliebiges Register in einem beliebigen Adressierungsmodus verwenden kann." - das ist die Konnotation, auf die ich meine Diskussion stützte. Ich stimme zu, dass dies nicht völlig klar ist, weshalb ich eine Menge Hand-waving-Gespräche folgen musste. –

4

Ruby und DSLs hat alotdiscussed gewesen.

Beispiel von sinatra:

get '/' do 
    'Hello world!' 
end 

Oder von diesen blog:

ChessGame.new do |move| 
    move.black_pawn(forward) 
    move.white_pawn(forward) 
    #… 
    move.white_queen(pwn_king) 
end 
5
  • mit offenen Klassen dh Sie Methoden, um Klassen hinzufügen können, nachdem sie
  • mit method_missing dh die Möglichkeit definiert sind der Bearbeitung von Fällen, wo Sie eine Nachricht sind senden Sie haben keine Methode definiert zum. Auch hier können Sie Code schreiben, der sich anpasst und nicht nur abstürzt.
  • mit einem Smalltalk-ähnlichen, konsistenten OO-Modell, z.B. Sie können Dinge wie 1.class 1.x {} tun. Dies ermöglicht einen Großteil der DSL-Unterstützung.
  • es hat Blöcke/Verschlüsse - macht es viel einfacher, flexibler Code zu schreiben
  • es nicht Ihre Zeit mit statischen jeder Variablen eingeben (dh versuchen, Probleme zu lösen, die nicht wichtig sind, wenn Sie tun TDD)
  • Sie haben keine klassenbasierten OO dh verwenden unterstützt Prototyp-basierte OO-Programmierung
2

ich nicht zu argumentieren kann der Lage sein, dass es elegant ist, glaube ich, in der Regel, dass Eleganz wird durch den Impl des Programmierers abgeleitet Emulation. Ich kann jedoch argumentieren, dass es prägnant ist, und ich denke, das ist es, was viele Leute wirklich fühlen, wenn sie sagen, dass Ruby elegant ist. Oft fühlt sich Code, der schnell zusammenkommt, elegant an.

Sie können die Ergebnisse der Programmiersprache Shootout here sehen. Sie werden feststellen, dass Ruby 1.9 flach gegen die linke Seite geklatscht ist, was bedeutet, dass es super prägnant ist. Ich würde wetten, dass jemand, der über eine elegante Sprache spricht, über eine Sprache spricht, die entweder auf der linken Seite oder in der Nähe ist. Haskell ist eine der wenigen bemerkenswerten Ausnahmen, die ich kenne, die eine Menge Aufwand erfordert, um bestimmte Dinge zu erledigen, aber immer noch außerordentlich elegant dabei ist.

+1

Wenn Sie sich nur auf Code-used konzentrieren möchten, stellen Sie Ihre eigenen Parameter für ein Ranking wie folgt ein - http://shootout.alioth.debian.org/u32/fun.php?d=data&calc=calculate&xfullcpu=0&xmem=0&xloc= 1 & binarytrees = 1 & chameneosredux = 1 & fannkuch = 1 & fast = 1 & knucleotide = 1 & mandelbrot = 1 & meteor = 0 & nbody = 1 & pidigits = 1 & regexdna = 1 & revcomp = 1 & spektralnorm = 1 & threadring = 0 – igouy

5

Nach meiner Erfahrung sind Blöcke der wichtigste Faktor, um Ruby elegant zu machen. was eleganter ist als jedes Schreiben Arrays/Hashes iterieren/etc ...

arr = ["one", "two", "three"] 
arr.each { |e| 
    puts e 
} 

Aber ich glaube, es als dies mehr ist, kommt die Eleganz der Sprache Ruby auch aus den Bibliotheken. Die meisten Bibliotheken haben den einzigartigen Ruby-Stil für Funktionsnamen verwendet, z. B. "each" für die Iteration oder die Verwendung von "!" und '?' Am Ende der Funktionsnamen für destruktive/boolesche Rückgabefunktionen hält Ruby Ruby 'elegant'.

4

Ruby ist alles über die Produktivität und die Programmierung Spaß, sind jedoch gibt mehrere Gründe, warum Ruby ist elegant:

  • reine OOP: Alles ist ein Objekt, so dass Sie Typen nicht zwischen primitiven unterscheiden müssen und Objekt .
  • Es unterstützt sowohl funktionale als auch Imperative Programmierparadigmen: das führt zu prägnantem und lesbarem Code.
  • Es unterstützt die Principle of Least Surprise: die Lesbarkeit unterstützt.
  • Es hat Verschlüsse und Blöcke: was ist wirklich cool für Internal DSLs tun.
  • Es hat eine robuste Metaprogramming API: das Schreiben von internen DSLs sowie ermöglicht.
  • Es ist sehr gut in Scripting-Aufgaben: Umgang mit Text und XML-Dateien und die Verwaltung von Sachen (es wird von System-Administratoren jetzt ein paar Tage verwendet).
  • Es hat eine sehr coole und unterstützende Community: Sie werden Unterstützung und Hilfe finden, was auch immer Ihr Problem ist. Diese Community unterstützt moderne und moderne Kodierungstechniken wie TDD und BDD.

Die Summe aller oben ist, dass Ruby verwenden Sie haben können:

  • Concise Code: Im Vergleich zu Java und C++, zumindest können Sie sich 50% der Code Eingabe speichern.
  • Lesbarkeit.

mit So lesbar und präzisem Code -> weniger Code zu schreiben -> weniger Code zu testen und zu pflegen ->Produktivität.

Ich sollte nicht vergessen, die große unterstützende Gemeinschaft hinter Ruby zu erwähnen.

0

Nur eine amüsante Randnotiz: this feels like php ist noch Ruby (von früher heute), aber die erste Antwort fühlt sich an wie elegante Ruby. In PHP schrieb ich dummen langen Code wie den verlinkten Post, um kleine Dinge zu tun. Zum Teil weil Lambdas im Grunde nicht existieren. Also muss ich sagen, dass Rubys Lambda-Unterstützung zusammen mit map/reduce für mich elegant ist.