Ruby base2

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Sujet Bases Ruby (suite)
Précédent Ruby base
Console Irb
Voir aussi Structure de donnees (Ruby)

Suite des bases du langage Ruby (voir Ruby base) : variables spéciales, types numériques, ranges, tableaux, manipulation de fichiers et classes.

Exécuter du Ruby

ruby -e 'print "Hello Ruby!\n"'
./ruby.rb
irb

Type d'une variable

y = 10
y.kind_of? Integer
y.class

Variables spéciales

$@   # Emplacement de la dernière erreur
$_   # Dernière chaine lue par gets
$.   # Dernier numéro de ligne lu par l'interpréteur
$&   # Dernière chaine correspondant à une regexp
$~   # Dernier match regexp (tableau de sous-expressions)
$n   # n-ième sous-expression du dernier match (= $~[n])
$=   # Drapeau d'insensibilité à la casse
$/   # Séparateur d'enregistrement en entrée
$\   # Séparateur d'enregistrement en sortie
$0   # Nom du script ruby en cours d'exécution
$*   # Arguments de ligne de commande
$$   # PID de l'interpréteur Ruby
$?   # Statut de sortie du dernier processus fils

Variables de classe et d'instance

@@total = 0   # Variable de classe
@total = 0    # Variable d'instance

Nombres

Classes numériques : Integer, Fixnum (petits entiers), Bignum (grands entiers), Float, Rational.

# Conversion en entier
Integer(10.898)
Integer("10898")
Integer(0xA4F5D)      # hexadécimal
Integer(01231)        # octal
Integer(0b01110101)   # binaire

# Conversion en flottant
Float(10)
Float("10.09889")

Méthodes

def multiply(val1, val2)
  result = val1 * val2
  puts result
end

multiply(2, 10)

Ranges

1..10    # Range de 1 à 10 inclus
1...10   # Range de 1 à 9

(1..10).to_a
('a'..'l').to_a
('cab'..'car').to_a

# Méthodes de range
words = 'cab'..'car'
words.min
words.max
words.include?('can')
words.reject { |subrange| subrange < 'cal' }
words.each { |word| puts "Hello " + word }

# Intervalle
(1..20) === 15
('k'..'z') === 'm'

Conversions : to_s (chaine), to_i (entier), to_a (tableau).

Range dans un case :

score = 70

result = case score
  when 0..40   then "Fail"
  when 41..60  then "Pass"
  when 61..70  then "Pass with Merit"
  when 71..100 then "Pass with Distinction"
  else "Invalid Score"
end

puts result

Tableaux

days_of_week = Array.new
days_of_week.empty?
days_of_week = Array.new(7)
days_of_week = Array.new(7, "today")   # pré-remplissage

Fichiers

5.times { print "Odelay!" }
print "pre", "event", "ual", "ism"

print File.read("/comics.txt")

FileUtils.cp('/comics.txt', '/Home/comics.txt')
Dir["/Home/*.txt"]

# Ajout en fin de fichier
File.open("/Home/comics.txt", "a") do |f|
  f << "Cat and Girl: http://catandgirl.com/"
end

print File.read("/Home/comics.txt")
File.mtime("/Home/comics.txt")
File.mtime("/Home/comics.txt").hour

Chargement d'un fichier structuré en table de hachage :

def load_comics(path)
  comics = {}
  File.foreach(path) do |line|
    name, url = line.split(': ')
    comics[name] = url.strip
  end
  comics
end

comics = load_comics('/comics.txt')

Classes

# Hash.new est équivalent à {}

class BlogEntry
  attr_accessor :title, :time, :fulltext, :mood
end

entry = BlogEntry.new
entry.title = "Today Mt. Hood Was Stolen!"
entry.time  = Time.now
entry.mood  = :sick
entry.fulltext = "I can't believe Mt. Hood was stolen!"

Constructeur initialize :

class BlogEntry
  def initialize(title, mood, fulltext)
    @time = Time.now
    @title, @mood, @fulltext = title, mood, fulltext
  end
end

Tri et itération :

blog.sort_by { |entry| entry.time }.reverse

blog.each do |entry|
  h2 entry.title
  p  entry.fulltext
end

Time.now - 2.weeks

Boucles et conditions

games = ["Super Mario Bros.", "Contra", "Metroid", "Mega Man 2"]

# unless = if not
unless games.empty?
  puts "Games in your vast collection: #{games.count}"
end

# if
if !games.empty?
  puts "Games in your vast collection: #{games.count}"
end

# Recherche
search = "Contra"
search_index = games.find_index(search)
if search_index
  puts "Game #{search} Found at index #{search_index}."
else
  puts "Game #{search} not found."
end

Voir aussi