The Object-Oriented Programming Language RubyDe Nederlandse Ruby Homepage




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.