Ruby

Programmation Orientée Objet

En Ruby, TOUT est objet, même les opérateurs. On peut donc appliquer à chaque élément un certain nombre de méthodes comme dans les exemples suivants :


	# Longueur d'une chaîne de caractères
	"Hello World".length		# => 11 

	# Index d'un caractère spécifique
	"Ruby".index("b")		# => 2

	# Valeur absolue d'un nombre
	-2005.abs 			# => 2005

	# Conversion d'une chaîne de caractères en entier
	"22".to_i			# => 22

	# Conversion d'un entier en chaîne de caractères
	443.to_s			# => "443"
	

Classes

Voici un exemple de définition de classe :


	class MaClasse [ < ClasseParent ]
		def initialize 
			... 
		end 

		[public | private | protected]
		def ma_methode 
			... 
		end 
	end
	

Quelques explications :


Un objet ainsi défini peut ensuite être utilisé de la façon suivante :


	# Instanciation
	obj = MaClasse.new( ... ) 
	
	# Appel d'une méthode
	obj.ma_methode 
	

Getters & Setters

Il existe plusieurs façons de déclarer des getters et setters en Ruby : une première méthode "classique" ou une méthode nettement plus simple :


	# Définition d'un getter
	def var1 
		return @var1 
	end
	
	# Autre méthode
	attr_reader :var1


	# Définition d'un setter
	def var1=( var1 ) 
		@var1 = var1 
	end 

	# Autre méthode
	attr_writer :var1
	
	
	# Définition d'un accesseur (getter et setter)
	attr_accessor :var2 
	

Comme on peut le constater, les méthodes attr_ permettent de déclarer très simplement des getters et/ou setters en limitant nettement le nombre de lignes de codes produit.

L'utilisation des getters et setters est également très simple :


	# Affectation d'une valeur
	obj.var1 = 10
	
	# Récupération d'une valeur et affichage
	puts obj.var1

	

Modules

Un module a pour principale utilité de permettre de défnir des méthodes et des constantes.

Voici un exemple d'utilisation du module Math inclus dans la librairie standard :


	Math.sqrt(2)	# => 1.41421
	Math::PI	# => 3.14159
	
	# Autre méthode d'appel
	include Math
	sqrt(2)		# => 1.41421
	PI		# => 3.14159	
	

Pour créer un module, on procède ainsi :


	# Définition d'un module	
	Module NomModule 
		def NomModule.nomMéthode 
			... 
		end 
	end 

	# Appel d'un module
	class MaClasse 
		include MonModule 
		... 
	end
	

Exceptions

En Ruby, la gestion des exceptions s'effectue via une syntaxe spécifique. Cependant, cette gestion est similaire a bien d'autres langages orientés objet. :


	begin 
		... # Code susceptible de lever une exception 
	rescue TypeException => e then 
		... # Code exécuté si une exception est levée 
	else 
		... # Code si aucune exception n'a été levée 
	ensure
		... # Code exécuté dans tous les cas 
	end
	

Il n'est pas obligatoire d'utiliser tous les mots-clés contenus dans le bloc begin - end. Cependant, rescue doit toujours précéder ensure.
Pour faire un parallèle avec un langage plus "classique", voici une comparaison des termes utilisés en Ruby et en Java :

RubyJava
begintry
rescuecatch
ensurefinally