Frage

Ist, ist, dass ich bin ein Anfänger lernen Ruby, oder ist es wirklich mehr Möglichkeiten zu schreiben (das gleiche) Dinge, die als Java/C#?Auch, wenn es ist mehr flexible als Java, gibt es die sprachlichen Merkmale von Ruby, die sind in der Regel nicht verwendet, um Verwirrung zu vermeiden?

Beispiele könnten sein, parallele Zuweisung und all die verschiedenen Arten zu schreiben, Strings, vielleicht?

Hinweis: Ich verlange nicht, für einen Vergleich mit Java/C#...nur diese Sprache in Frage, bitte...

Edit: Ich verstehe, dass C#, Java und Ruby sind stark typisiert, und dass nur Ruby (wie Python und andere) ist dynamisch typisiert (während Java/C# sind statisch typisiert).Einige der Antworten, die sagen, dass dynamisch typisierte Sprachen sind mehr flexible.Ist das notwendigerweise wahr, und wie wirkt er sich auf die syntax? Ich bin nur Fragen, über die syntaktische Flexibilität.

(PHP ist auch dynamisch typisiert, und es funktioniert nicht scheinen flexibler als Java/C#, so weit wie ich gesehen habe.Wieder, ich meine in Bezug auf die syntax, nicht in Bezug auf die Bereitstellung von noch anderen Aspekt...)

War es hilfreich?

Lösung

Ich weiß nicht, Java oder C #, aber ich lasse die Tatsache, dass Sie neu definieren können, wie + arbeitet auf Zahlen für sich selbst sprechen.

Andere Tipps

Als für mich die am häufigsten verwendeten Funktionen in Ruby und fehlt in Java sind code-Blöcke/lambdas/Verschlüsse.

Ein weiterer großer (aber vielleicht gefährlich) Funktion open-Klassen - Sie können ändern, was die Klasse, die Sie wollen - hinzufügen von neuen Methode, änderung Alter, etc.Sie können auch add-Methode auf bestimmte Objekt und nicht die ganze Klasse :).

Eine andere dynamische Sprache, ziemlich ähnlich wie Ruby, Python.Jedoch, in der Zen of Python, eine der Regeln besagt, dass "es sollte immer eine und nur eine Weise etwas zu tun".Dies ist ein Gegensatz zu Ruby, die können so viel-meta-Programmierung, die im wesentlichen gibt es eine unendliche Zahl von Möglichkeiten, das gleiche zu tun.

Das heißt, es ist etwas ironisch, dass bis in Python 3.0 (auch bekannt als:3000) string und unicode-Werte wurden unterschiedliche Typen.Während es Sinn macht, die Leute bekommen manchmal in Probleme, wenn Sie die Konvertierung zwischen den beiden eine Menge zu führen text-Operationen.

Wenn Sie die Wahl haben, würde ich fast empfehlen die Verwendung von Python als Einführung in die dynamische Sprachen.Es ist nichts falsch mit Ruby, aber Sie können finden, Sie laufen in immer weniger Situationen, in denen der "richtige" Weg, etwas zu tun, ist nicht ganz offensichtlich.

In Reaktion auf die PHP dynamisch typisiert:

PHP-Typ-system ist flexibel, so dass die Typen automatisch konvertiert, basierend auf welchem Kontext Sie verwendet werden, in.Dieses eigentlich nicht machen, dann realen dynamischen Typen, aber.Die Sprache selbst ist größtenteils statisch sind und nicht zulassen, dass Sie Attribute hinzufügen, um Objekte zur Laufzeit, zum Beispiel (zumindest das Letzte mal habe ich geprüft).

Python, und womöglich Ruby, sind tatsächlich stark typisiert, das heißt, Sie können getrost tun, geben Sie vergleichen, und können nicht tun, PHP tricks, wie das hinzufügen von numerischen strings zu bekommen eine Nummer.Echte dynamische Sprachen auch oft für meta-classing wo man das einstellen kann der Typ einer Instanz oder Klasse, oder Attribute hinzufügen, um entweder alle zur Laufzeit.

Ruby ist eine dynamische Sprache. C # und Java ist sowohl statisch typisierte Sprache mit starken Typisierung. C # in v4.0 wird dynamische Funktionen hinzufügen, aber bis jetzt, Java und C # haben ein ganz anderes und strengeres Paradigma als dynamische Sprachen wie Ruby und Python haben.

I kommentiert RKJ Antwort über Lambda ist in Bezug auf. Dieser Code zeigt das Beispiel von Ihnen gewünschte;

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

Der erste Punkt ist zu bemerken, dass das Verfahren fixed_point dem allgemeinen Gedanken, schrittweise einen Prozess auf bestimmte Daten der Anwendung verarbeitet, bis sie einen bestimmten Test bestanden wird. Die sqrt Funktion definiert den Prozess der eine Quadratwurzel zu finden und den Test zu bestimmen, wann wir zufrieden sein sind. Diese ‚Verfahren‘ wird dann weitergegeben wie jede andere Form von Daten, so dass fixed_point arbeiten kann, es ist Magie.

Statt vorübergehend den Prozess und testen Sie die ganze Sache zu speichern könnte sein, anonym. Wir könnten umschreiben sqrt wie;

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

Ohne diese Fähigkeit würde ich sowohl den Prozess und den Test als einzelne Funktionen definieren und eine spezielle sqrt_fixed_point Funktion erstellen, sie zu nennen. Soweit ich bin mir bewusst, Java ähnlich mit Funktoren etwas tun kann, aber ich weiß nicht genug, um zu kommentieren. Der Konsens ich in Blogs oder ähnlich gesehen habe ist, dass Java dies so horrend kompliziert macht, dass Sie ein Nasenbluten bekommen es einfach versuchen.

Natürlich eine weitere Option, die Ruby gibt, ist metaprogramming. Ich kann sqrt so umschreiben, dass es (on the fly) fixed_point umschreibt den richtigen Prozess und Test, aber das ist wahrscheinlich ein Missbrauch des Features: -)

ps. Der JoelOnSoftware Link gepostet wird verdient Wiederholung; http://www.joelonsoftware.com/items/2006/08/01. html

Alle dynamisch typisierten Sprachen (wie Ruby) sind in der Regel flexibler als statisch typisierten diejenigen (wie Java). Sie müssen nicht mit dem Typ-System zu kämpfen haben, die Sie oft statisch typisierten Sprachen zu tun in enden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top