2. Hoe is Ruby in vergelijking met...?
2.1 Hoe is Ruby in vergelijking met Python?
Python en Ruby zijn beide object-georienteerde talen die een soepele overgang mogelijk maken van een procedurele- naar een OO programmeerstijl. Smalltalk daarentegen bestaat volledig uit objecten; je kunt niets doen voordat je objecten, overerving en de omvangrijke Smalltalk klasse hiërarchie begrijpt. Door procedurele "steuntjes" te bieden overwinnen Python en Ruby een "handicap" die Smalltalk ervan heeft weerhouden om echt door te breken. Het verschil tussen de beide talen zit in het feit dat ze langs tegengestelde wegen tot een oplossing voor het genoemde probleem komen.
Python is een hybride taal. Het heeft functies voor procedureel
programmeren
en objecten voor OO programmeren. Python overbrugd de kloof tussen de
twee
werelden door functies en methodes uitwisselbaar te maken door het
gebruik
van de expliciete "self" parameter van iedere methode definitie.
Wanneer
een functie word toegevoegd aan een object word de eerste parameter
automagisch
een referentie naar de ontvanger.
Ruby is een pure OO taal die zich kan voordoen als een procedurele
taal.
Het heeft geen functies, alleen methode aanroepen. In Ruby is de
ontvanger van de aanroep, die ook "self" heet, een onzichtbare
parameter zoals de "this" in C++. Een "def" statement buiten een klasse
definitie, wat een functie is
in Python, is een methode aanroep in Ruby. Deze "functies" worden
private methodes van de klasse Object, de oorsprong van de Ruby klasse
hiërarchie. Procedureel programmeren is netjes opgelost langs de
tegengestelde weg: alles is een object. Als de gebruiker nog niets van
objecten begrijpt kan hij gewoon doen alsof "def" een functie definitie
is en gewoon doorwerken.
Door de pure OO heeft Ruby een aantal eigenschappen die Python mist
of waar nog steeds naartoe gewerkt word: een uniforme type / klasse
hiërarchie, metaklassen, de mogelijkheid om alles te
subclassen, een uniforme
methode voor methode aanroep (niets van die len()
is a
functie
maar items()
is a methode onzin). Ruby, zoals Smalltalk,
kent
alleen single inheritance, maar heeft een zeer krachtig mix-in concept:
een
klasse definitie mag een include opdracht voor een module bevatten wat
tot
gevolg heeft dat alle methodes, constanten etc. die in die module zijn
gedefinieerd
onderdeel van de klasse worden
Ruby, nogmaals zoals Smalltalk, biedt closures en code-blocks en weet die goed te gebruiken. De Ruby collection klassen en iterators zijn uitstekend, veel krachtiger en eleganter dan de ad hoc oplossingen die Python heeft voortgebracht (lambdas en list comprehensions).
Ruby's syntax en ontwerp filosofie zijn sterk beïvloed door Perl. Het heeft veel variatie in syntax. Statement modifiers (if, unless, while, until, etc.) mogen voorkomen na elk statement. Somige keywords zijn optioneell (de ``then'' in een ``if'' statement bijvoorbeeld). Haakjes mogen soms worden weggelaten bij bij methode aanroepen. De receiver van een methode mag gewoonlijk ook worden weggelaten. Veel, heel veel zaken zijn overgenomen uit Perl. Ingebouwde reguliere expressies, $_ en friends, here documenten, Het onderscheid tussen single-quoted en double-quoted strings, $ en @ prefixes om verschillende soorten namen te onderscheiden etc.
Als je van Perl houdt, dan hou je van Ruby en zal jij je gelijk
thuis voelen
in de syntax. Hou je van Smalltalk, dan hou je van Ruby en zal jij je
gelijk
thuis voelen in de semantiek. Hou je van Python dan hangt het ervan af
of
je aan het grote verschil in ontwerp filosofie tussen Python en Ruby /
Perl
kunt wennen.
Ruby is veel complexer dan Python maar zijn mogelijkheden vormen,
voor het grootste deel, een samenhangend geheel. Ruby is goed ontworpen
en zit vol gaafe ideeën die gebruikt zouden kunnen worden voor
P3K. Ik ben
er niet zeker van hoeveel Python programmeurs zich aangetrokken zullen
voelen
- ik ben er (nog) niet voor gewonnen. Maar het is het zeker waard om
goed
te bestuderen en zou een echte bedreiging voor Perl kunnen gaan vormen.
Gepost door John Dell'Aquila
in comp.lang.python
, 17/11/2000. Overgenomen met
toestemming.