Structure de donnees (Ruby)

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Sujet Structures de données Ruby
Types tableaux, ranges, hachages
Console Irb / Console (Rails)
Voir aussi Chaine de caracteres (Ruby)

Principales structures de données de Ruby : tableaux, ranges, blocs, tables de hachage et symboles, ainsi que les classes et l'héritage. Exemples à tester dans Irb ou la Console (Rails) (invite >>).

Tableaux

"foo bar     baz".split
"fooxbarxbazx".split('x')

a = [42, 8, 17]
a[0]
a[-1]
a.first
a.last == a[-1]
x = a.length

# Tri
a.sort
a.reverse
a.shuffle

# Ajout d'entrées (types hétérogènes possibles)
a << 7
a << "foo" << "bar"
a.join
a.join(', ')

Ranges

0..9
(0..9).to_a

a = %w[foo bar baz quux]   # %w crée un tableau de chaines
a[0..2]

('a'..'e').to_a

Blocs

(1..5).each { |i| puts 2 * i }
# |i| est la syntaxe Ruby pour une variable de bloc

(1..5).each do |i|
  puts 2 * i
end

3.times { puts "Betelgeuse!" }   # bloc sans variable

(1..5).map { |i| i**2 }          # ** = puissance
%w[a b c].map { |char| char.upcase }

('a'..'z').to_a.shuffle[0..7].join

Tables de hachage et symboles

user = {}                        # table de hachage vide
user["first_name"] = "Michael"
user["last_name"]  = "Hartl"
user["first_name"]
user                             # => {"last_name"=>"Hartl", "first_name"=>"Michael"}

Les tables de hachage ne garantissent pas l'ordre des éléments (utiliser un tableau si l'ordre importe).

user = { "first_name" => "Michael", "last_name" => "Hartl" }

# Symboles comme clés
personne = { :nom => "Michael Hartl", :email => "michael@example.com" }
personne[:nom]
personne[:password]   # clé indéfinie => nil

Tables imbriquées

params = {}
params[:user] = { :nom => "Michael Hartl", :email => "mhartl@example.com" }
params[:user][:email]   # => "mhartl@example.com"

flash = { :success => "Ça marche !", :error => "Raté… :-(" }
flash.each do |key, value|
  puts "La clé #{key.inspect} a la valeur #{value.inspect}"
end

Parenthèses et accolades optionnelles

# Parenthèses optionnelles à l'appel
stylesheet_link_tag('blueprint/screen', :media => 'screen')
stylesheet_link_tag 'blueprint/screen', :media => 'screen'

# Accolades optionnelles sur le dernier argument (hash)
stylesheet_link_tag 'blueprint/screen', { :media => 'screen' }
stylesheet_link_tag 'blueprint/screen', :media => 'screen'

Classes et héritage

# Constructeurs nommés
s = String.new("foobar")
s.class
s == "foobar"

a = Array.new([1, 3, 2])   # valeur initiale nécessaire
h = Hash.new               # le hash n'en prend pas
h[:foo]                    # => nil
h = Hash.new(0)            # clés inexistantes => 0
h[:foo]                    # => 0

# Héritage
s.class                    # String
s.class.superclass
s.class.superclass.superclass   # Ruby 1.9 -> BasicObject

Définir puis modifier une classe :

class Mot
  def palindrome?(string)
    string == string.reverse
  end
end

w = Mot.new
w.palindrome?("foobar")

# Rouvrir la classe String pour lui ajouter une méthode
class String
  # Retourne vrai si la chaine est son propre inverse
  def palindrome?
    self == self.reverse
  end
end

"kayak".palindrome?   # => true

Exemple de classe complète :

class User
  attr_accessor :nom, :email   # génère les getters et setters

  def initialize(attributes = {})   # appelé lors de User.new
    @nom   = attributes[:nom]
    @email = attributes[:email]
  end

  def formatted_email
    "#{@nom} <#{@email}>"
  end
end

require './example_user'

Voir aussi