Ich lerne Ruby. Mein Hintergrund ist C ++ / Java / C #. Insgesamt mag ich die Sprache, aber ich bin ein wenig verwirrt darüber, warum es so viele verschiedene Möglichkeiten gibt, dasselbe zu erreichen, jedes mit einer eigenen etwas anderen Semantik.
Nehmen Sie zum Beispiel eine String-Erstellung vor. Ich kann '', '', q%, Q% oder nur% verwenden, um Strings zu erstellen. Einige Formulare unterstützen die Interpolation. Andere Formen erlauben mir, die Trennzeichen für Zeichenfolgen anzugeben.
Warum gibt es fünf Möglichkeiten, String-Literale zu erstellen? Warum sollte ich jemals nicht interpolierte Strings verwenden? Welchen Vorteil hat die% -Syntax gegenüber zitierten Literalen?
Ich weiß, dass es in Rubin einen Wert in der Redundanz geben muss, aber meine untrainierten Augen sehen es nicht klar. Bitte erleuchte mich.
Warum sollte ich jemals nicht interpolierte Strings verwenden?
Wenn Sie die Interpolation natürlich nicht wollen. Zum Beispiel geben Sie vielleicht eine Dokumentation über die String-Interpolation aus:
%Vor%Welchen Vorteil hat die% -Syntax gegenüber zitierten Literalen?
Es erlaubt Ihnen, Strings natürlicher zu schreiben, ohne die Anführungszeichen, oder wenn Sie nicht vielen Dingen entgehen wollen, analog zu C # 's String-Literal Präfix @
.
Es gibt viele andere% -Notierungen:
%Vor% Es gibt auch %s
(für Symbole) und einige andere.
Warum gibt es fünf Möglichkeiten, String-Literale zu erstellen?
Das ist nicht besonders ungewöhnlich. Betrachten Sie zum Beispiel C #, das verschiedene Möglichkeiten zum Erzeugen von Strings bietet: new String()
; %Code%; %Code%; ""
und so weiter.
Ich bin kein Ruby-Experte, aber haben Sie jemals den Begriff "syntaktischer Zucker" gehört? Grundsätzlich bieten einige Programmiersprachen unterschiedliche Syntax, um die gleiche Aufgabe zu erfüllen. Manche Leute könnten einen Weg leichter finden als andere aufgrund seiner früheren Programmier- / Syntaxerfahrung.
In den meisten Fällen werden Sie normale String-Trennzeichen verwenden. Der Hauptunterschied zwischen einfachen und doppelten Anführungszeichen besteht darin, dass doppelte Anführungszeichen Ihnen erlauben, Variablen zu interpolieren.
%Vor% %q
und %Q
sind nützlich, wenn Sie keine Anführungszeichen verwenden können, da sie Teil der internen Zeichenfolge sind.
Zum Beispiel könnten Sie am Ende schreiben
In diesem Fall dürfen Sie keine Anführungszeichen als Trennzeichen verwenden, es sei denn, Sie möchten interne Attributtrennzeichen umgehen. Außerdem können Sie kein einfaches Anführungszeichen verwenden, da die Variable img_path
nicht interpoliert wird.
Ein weiterer Grund ist ein kleiner Leistungsschub für nicht interpolierte Strings. '' Vs '' bedeutet, dass Ruby nicht berücksichtigen muss, was sich in der Zeichenfolge überhaupt befindet. Sie sehen also, dass Benutzer einfache Anführungszeichen für Array-Schlüssel oder -Symbole verwenden, weil sie schneller sind. Für was es wert ist, werde ich ein kleines Benchmark enthalten.
%Vor%ergibt:
%Vor% Sie würden nicht interpolierte Strings verwenden, wenn Ihre Zeichenfolge viele Sonderzeichen enthält (wie Backslashes, #{}
usw.) und Sie nicht alle entzweien wollen.
Sie würden verschiedene Trennzeichen verwenden, wenn Ihre Zeichenfolge eine Menge Anführungszeichen enthält, die Sie andernfalls zu vermeiden hätten.
Sie würden heredocs verwenden, wenn Ihre Strings viele Zeilen haben, die die normale Stringsyntax unhandlich erscheinen lassen würden.
Entlang der Linie von Johns Antwort:
In schnellen Hacks lasse ich oft einen Perl- oder Sed-Einliner mit Grep-Syntax aus meinem Ruby-Skript laufen. Wenn ich %[ ]
type syntax verwenden kann, kann ich meine regexp einfach vom Terminal kopieren / einfügen
Die ursprüngliche Frage ist, warum es in Ruby so viele verschiedene Vorgehensweisen gibt.
Manchmal sind die verschiedenen Dinge sinnvoll: Zitat ist ein guter Fall, wo unterschiedliches Verhalten eine andere Syntax benötigt - nicht / interpolierend, alternative zitierende Zeichen, etc. - und historischer Zufall verursacht Synonyme wie% x () vs '', ähnlich wie in Perl.
Das Synonymproblem - [] .size [] .length [] .count - fühlt sich an wie ein Versuch in einer Welt hilfreich zu sein, in der die Sprache zu zufällig ist, um IDEs helfen zu können: Affepatching und das Seltsame Die Kombination von strenger, aber dynamischer Typisierung macht Laufzeitfehler zu einem unvermeidlichen und frustrierenden Teil der Programmierung, daher versuchen die Leute, das Problem durch die Bereitstellung von Synonymen zu reduzieren. Leider verwirren sie Programmierer, die an verschiedene Methoden gewöhnt sind, die verschiedene Dinge tun.
Das Problem "so ähnlich, aber nicht ganz", zum Beispiel ...
%Vor%... kann nur wirklich als Fehler angesehen werden. Jede Sprache hat sie, aber sie sind normalerweise arkaner als das.
Und dann gibt es die einfache, willkürliche 'Verwendung scheitern, anstatt zu erhöhen, es sei denn, Sie wiederholen gerade eine Ausnahme' Unsinn in den Rubocop Codierungsstandards.
Es gibt ein paar nette Dinge in Ruby, aber wirklich - ich würde eher etwas besser fundiertes programmieren.