Hackety Hack

Utiliser Hackety Hack est bien plus qu'une simple utilisation de Ruby. C'est un univers plein d'images et de mini-navigateurs. Du beau boulot, qui mérite une explication n'est-ce pas?

Cette page présente les bases de l'utilisation de toutes ces choses à cliquer. Le menu sur la gauche propose d'autres pages (telles que les sections Canal et Bibouilleur) qui couvrent les commandes spécifiques à H-ety H.

Hé, utilise ce menu Programme bien pratique!

!screenshot-help-progdrop.png!

Sur l'écran pricipal d'Hackety Hack, tu trouve une liste de tes programmes sauvegardés. Au menu de chaque programme, tu pourras le Lancer, le Partager ou lEffacer'. Lancer et Partager sont les meilleurs!

  • Lance le va démarrer le programme instantanement, à l'endroit où tu te trouve. C'est juste un raccourcis pratique pour le programme qui fonctionnent déjà, pour les choses que tu as déjà terminé.
  • Partage le va charger le programme sur ton espace perso du site Hackety Hack.
  • Efface le va supprimer le programme POUR TOUJOURS! Fais attention! (Alors que si tu as partagé ton programme, il restera disponible sur le site d'Hackety Hack.)

Oh, et les Tables en ont un, eux aussi.

!screenshot-help-tabledrop.png!

Pour les Tables, tu as un menu légérement plus court, réduit à Partage le et

Efface le.

Partager des Tables est un peu différent. Tu ne peux la partager qu'une seule fois.

!\screenshot-help-tablelink.png!

La première fois que tu partage une Table, elle est copiée dans ton espace personnel sur le site hacketyhack.net site. Après cela, le programme affiche une petit lien chainé. Ceci signifie que la table est déjà partagée.

Personnalise le

!\screenshot-help-setuplink.png!

Hackety Hack a quelques paramètres personnels à renseigner, afin de profiter pleinement de l'expérience.

Pour modifier tes préférences personnelles, clique sur l'icône de la maisonnette, dans la barre d'outils. Une fois sur la page d'accueil, cherche le liens Tes paramètres en dessous de l'image de Hacky la souris.

Oui, et bien, clique dessus.

L'écran de configuration ressemble à cela:

!screenshot-help-setup.png!

Avec seulement deux sections, il n'y a réellement pas grand chose sur cette page de configuration.

  • La partie identifiant HacketyHack?.net est là pour enregistrer ton nom d'utilisateur et ton mot de passe pour le site hacketyhack.net. Si tu n'as pas de compte, [crée en un]!
  • La partie HTTP Proxy n'est normallement pas nécessaire. Certaines écoles et certains espaces de travail utilise un proxu HTTP pour accèder à l'internet. Si tu es derrière un proxy, tu devras remplir ces champs sinon tout ce qui est lié à la bibliothèque Web ne fonctionnera pas pour toi!

Oh, et à propos des proxies HTTP: utilise une adresse HTTP complète. Donc, si ton proxy est proxy.com sur le port 9009, tu devras utilisé l'URL:

 http://proxy.com:9009/

Si tu proxy nécessite un identifiant et un mot de passe, ajoute le à l'URL, comme ceci:

 http://username:password@proxy.com:9009/

Méthodes par défaut

Ces méthodes peuvent être utilisées n'importe où dans les programmes Hackety Hack.

Toutes ces commandes sont inhabituelles car tu ne les attaches pas avec un point. Toutes les autres méthodes de ce manuel doivent être attachées à un objet par un point. Mais celles-ci sont fournies par défaut (aussi appelées méthode du noyau (Kernel) ou méthodes built-in.) Ce qui veux dire: pas de point!

Une commande très courante est puts:

 #!ruby

 puts "Pas de point en vue"

Compare là à la méthode reverse, qui n'est pas une méthode du Kernel et qui est disponible avec les Tableaux et les Chaînes:

 #!ruby

 "Sulfate de Calcium".reverse

   #=> "muiclaC ed etafluS"

 [:chiens, :vaches, :serpents].reverse

   #=> [:serpents, :vaches, :chiens]

ask( message )

Ouvre Pops up a window and asks a question. For example, you may want to ask someone their name.

 #!ruby

 name = ask("Saisis ton nom s'il te plaît:")

Quand le script ci-dessus est lancé, la personne assise devant l'ordinateur va voir apparaître une fenêtre avec une boîte de dialogue pour entrer son nom. Ce nom sera ensuite sauvegardé dans la variable name.

ask_color(titre: chaîne)

Fait apparaître une fenêtre avec un sélecteur de couleur. Le programme attendra qu'une couleur soit sélectionnée, puis retournera un objet Couleur. Consulte la page d'aide relative à Web.page pour les différentes façons d'utiliser cette couleur.

 #!ruby

 backcolor = ask_color("Choisis un arrière-plan")

 Web.page do

   body do

     style('background-color' => backcolor)

   end

 end

ask_open_file()

Ouvre une fenêtre "Ouvrir un fichier...". C'est la fenêtre standard qui t'affiche tous tes dossiers et te permet de sélectionner un fichier à ouvrir. Elle te renvoie le nom du fichier.

 #!ruby

 filename = ask_open_file

 puts File.read(filename)

ask_save_file()

Ouvre une fenêtre "Enregistrer un fichier..." , similaire à ask_open_file, décrite ci-dessus.

 #!ruby

 save_as = ask_save_file

exit()

Arrête ton programme. Appelle cette méthode chaque fois que tu veux lui indiquer de soudainement arrêter.

print( message, message, ... )

Écrit quelque chose sur la page du programme Hackety Hack. Chaque programme possède une page cachée sur laquelle on peut écrire. Quand le programme est terminé, cette page apparaît. Tu peux utiliser cette page pour afficher le rapport de tout ce que le programme à fait. Tu peux aussi construire une page avec des liens vers d'autres programmes ou d'autres fichiers.

 #!ruby

 print "Ce programme est terminé. À présent chacun peut rentrer chez soi."

puts( message, message, ... )

Une variante de print. La méthode print écrit les messages sur une seule longue ligne. La méthode puts, quand à elle, écrira chacuns de ces messages sur une ligne séparée.

 #!ruby

 puts "Salut.", "Bonjour.", "Il y a quelqu'un ici?"

Le code qui suit affichera chaque message sur sa propre ligne.

 Salut.

 Bonjour.

 Il y a quelqu'un ici?

p( obj, obj, ... )

La méthode p t'aide à voir le type des objets aux quels tu as à faire. Si tu as un object dans la variable stuff, tu peux utiliser p pour connaître ce qu'il y a à l'intérieur.

 #!ruby

 stuff = Web.fetch("http://feeds.feedburner.com/boingboing/iBag")

 p stuff

Dans l'exemple ci-dessous, la méthode Web.fetch est utilisée pour obtenir un flux du blog Boing Boing.

 (Web::Feed "Boing Boing")

Bien sur, il faut que la variable stuff contienne un flux défini!

say( message )

Lorsqu'un programme tourne, un petit sucrfe d'orge tourne avec un message disant "Tourne...". Si ton programme doit tourner longtemps, tu voudras peut-être changer ce message. Peut-être voudras tu informer la personne devant l'ordinateur que 50% de la tâche est déjà effectuée.

 #!ruby

 say("Ok, j'en suis à 50%.")

Une fois ton programme terminé, le message et le sucre d'orge vont disparaître.

Address

Une Addresse identifie un endroit dans le monde. Pour l'instant, c'est un peu primitif, elle utilise une simple carte Yahoo!

Les Addresses sont crées grâce à une chaîne. Pour les adresses aux États-Unis, indique la rue, la ville, et l'état. Beaucoup d'abréviations fonctionnent, alors essaie simplement et vois ce qui se passe!

 #!ruby

 motel = Address("606 E 27th, Scottsbluff, NE 69361")

 puts motel

Google Maps entre en conflit avec Hackety Hack les mauvais jours, mais j'espère que cela va s'améliorer un jour

L'objet Channel

Le "Channel" offrent aux bidouilleurs un moyen de se passer des messages. Chaque bidouilleur enregistré sur le site hacketyhack.net peut paramétrer sont propre canal.

Pour se connecter au canal central de test:

 #!ruby

 chan = Hacker('central').channel('test')

La variable chan contient à présent un objet "Channel", qui peut être utilisé pour envoyer et lire des messages.

 #!ruby

 chan.say("Y'a quelqu'un?")

Tout objet Ruby peut être envoyé par ce canal. Cela signifie qeu tu peux envoyer des images (Pictures), par exemple.

Ou une Adress.

 #!ruby

 chan.say(Picture("C:/test.jpg"))

 chan.say(Address("6 Delancey St, New York, NY 10002"))

hear()

Récupère depuis le canal tous les lessages non lus.

 #!ruby

 chan.messages().each do |message|

   puts(message)

 end

name()

Le nom de ce "channel", une chaîne de caractère.

 #!ruby

 chan = Hacker('why').channel('lobby')

 chan.name()  #=> "lobby"

owner()

Le nom du bidouilleur qui possède ce "channel".

 #!ruby

 chan = Hacker('why').channel('lobby')

 chan.owner()  #=> "why"

say( Object )

Envoi un message au canal.

 #!ruby

 chan.say("Y'a quelqu'un?")

start()

Démarre le canal, s'il na jamais été utilisé auparavant. Pour pouvoir le démarrer, il faut que ce soit sous ton identifiant Hackety Hack.

 #!ruby

 Hacker('test').channel('brandnew').start

Picture

Les objets images sont un moyen d'afficher des images stockées sur ton ordinateur.

 #!ruby

 icon = Picture("C:/my-icon.gif")

 puts icon

La classe Hacker

Les objets Hacker te permettent d'utiliser du code ou des messages avec d'autres bidouilleurs.

 #!ruby

 Hacker('why').load_program('youtube.rb')

La bibliothèque Table

Les Tables sont là pour stocker des listes de choses qui se ressemblent. Par exemple: un blog.

Les entrées de blog se ressemble: elles sont toutes un titre et un zone de saisie. Tu peux stocker une série d'entrées de blog dans une seule table.

Regarde aussi Web.popup(name), qui créer automatiquement les tables qui sont associées au fenêtres popups.

all()

Ouvre un Tableau de tous les éléments que tu as sélectionnés. Tu peux aussi utiliser each pour te déplacer parmis les élémentsto, dans l'ordre.

each() { |item| }

Pour se déplacer parmi les éléments que tu as séléctionné.

 #!ruby

 Table("Blog").recent(10).each do |entry|

   puts entry[:title]

 end

Dans cet exemple, le each illustre le fait que j'ai sélectioné les dix dernières entrées de blog, en utilisant la méthode recent.

first()

Récupère le premier élément dans la table, parmi ceux que tu as sélectionné. L'élément retourné est un dictionnaire, un hachage.

last()

Récupère le dernier élément dans la table, parmi ceux que tu as sélectionné. L'élément retourné est un dictionnaire, un hachage.

limit( un Nombre )

Réduit le nombre d'éléments que tu obtiens.

only( un Nombre )

Récupère un élément spécific d'un Table à partir de son ID.

 #!ruby

 entry = Table("Blog").only(6)

 puts entry[:title]

recent( un Nombre )

Récupère l'élément le plus récent d'une Table.

 #!ruby

 entries = Table("Blog").recent(10)

Ceci va charger les dix plus récentes entrées de la Table Blog.

La méthode recent est en fait un simple raccourcis pour utiliser conjointement order et limit:

 #!ruby

 entries = Table("Blog").order("Created DESC").limit(num)

save( un Dictionnaire )

Enregistre un seul élément dans la table.

 #!ruby

 Table("ToDo").save(:what => "Faire un curry-coco",

   :finished => false, :difficulty => 4)

L'élément doit être un dictionnaire, comme vu ci-dessus. La clé du Tableau (comme par exemple :what, :finished and :difficulty) fixe un patron pour

tous les éléments ToDo. La prochaine fois que quelque chose sera enregistré dans la table ToDo, ce modèle sera de nouveau appliqué.

 #!ruby

 id = Table("ToDo").save(:what => "Trouver des sommiers à ressorts",

        :finished => true, :difficulty => 1)

Quand tu sauvegardes avecsave, tu récupères un id, un numéro pour cet élément. Quand tu sauvegardes pour la première fois, tu récupères 1. La fois suivante, tu obtiens 2. Ce nombre est nécessaire lorsque tu utilises la méthode only.

Il existe quelques clés spéciales que tu ne peux pas sauvegarder. Ce sont:

:id, :created, and :updated. Le :id dont nous venons de parler.

La clé :created indique la date de première sauvegarde de cet élément.

La clé :updated qui est la date de la dernière mise à jour.

 #!ruby

 latest_entry = Table("ToDo").recent(1).first

 puts latest_entry[:created]

Video

Les objets Video te permettent d'afficher les vidéos enregistrées sur ta machine.

 #!ruby

 puts Video("video.flv")

Ruby

Hackety Hack ajoute tout un tas de choses bien pratique. La bibliothèque standard contient toutes les choses qui sont normalement fournies avec le langage Ruby lui même. Des choses basiques et fondamentales telles que les nombres et les listes.

Tu peux trouver un bon résumé des composants de Ruby sur l'anti-sèche d'Hackety Hack, qui apparaît lorsque

tu clique sur l'icône baguette magique de la barre d'outils.

Types spéciaux

Ruby propose trois types spéciaux: nil, true et false.

nil

Nil est unique en son genre. Littérallement, elle signifie "rien". Nil est la chose à mettre dans une variable

si tu veux vraiment que cette variable soit vide.

Beaucoup de méthodes Ruby retournent nil. La plupart du temps cela signifie "rien n'a été trouvé"

ou "non, cela ne fait rien." C'est une façon sure de ne rien retrourner,

plutôt que de rapporter une erreur (qui pourrait stopper le programme.)

 #!ruby

 list = [1, 2, "January", [3, 4, 5]]

 found = list.detect { |x| x == "February" }

  #=> nil

Dans cet exemple, nous cherchons la chaîne "February" dans la liste. Nil est retournée.

Un premier exemple de "rien n'a été trouvé."

Tu peux contrôler nil en utilisant le if.

 #!ruby

 if found

   puts "Found February!"

 end

Nil possède possède une méthode bien pratique! En effet, tout est objet en Ruby. Ceci signifie que toute chose

est utile et possède ses propres actions (appelées méthodes.)

Une méthode nil? existe pour chaque objet. Elle répond true uniquement pour l'objet nil.

 #!ruby

 if found.nil?

   puts "The `found` variable is really nil!"

 end

true et false

Les types true et false sont les yin et yang, oui et non, positif et négatif.

On utilise très souvent ces deux là avec if.

 #!ruby

 if tivo_shows.include?("Le rapport Colbert ")

   puts("Très bien, le rapport Colbert est en cours d'enregistrement")

 end

Dans l'exemple ci-dessus, nous avons une liste d'émissions de télé dans la variable tivo_shows.

Nous utilisons la méthode include? pour certaines émissions. Puisque include? nous retourne un oui ou un non

(vrai ou faux), l'utilisation d'un if est toute indiquée. Le if nous laissera continuer si l'émission

est trouvée.

Les méthodes telles que Array.detect, Hash.has_key? et File.exists? retournent toutes

vrai ou faux. Si la méthode a un point d'intérrogation à la fin, elle renvoie généralement

un vrai ou faux.

COmbine les avec un if dans ton programme.

Tableaux

Un tableau est une liste de choses. Utilise cela lorsque tu as des choses que tu

cherches à conserver dans un ordre précis.

Tu crées un nouveau tableau en utilisant des crochets pour encadrer une liste d'éléments. Penses-y comme

à une chenille agrafée dans ton code. Les crochets sont les agrafes. Les virgules entre chaques éléments

sont les pattes de la chenille.

 #!ruby

 soap_brands = ["Zest", "Irish Spring", "Dove"]

Les tableaux peuvent être facilement complétés avec la méthode push. Ou encore l'opérateur <<, qui un

un symbole signifiant "ajouter".

 #!ruby

 soap_brands.push "Lava"

 soap_brands << "Ivory"

Les tableaux commencent à compter à partir de 0. Cela signifie que le premier élément

dans la liste à l'indice zéro.

 #!ruby

 feed = Web.fetch("http://redhanded.hobix.com/", :as => Web::Feed)

 feed.items = [feed.items[0], feed.items[1], feed.items[3]]

Le code ci-dessus fait un nouveau tableau à partir du premier, du deuxième et du quatrième élément

trouvé dans le flux.

Oh, une chose encore. Tu peux aussi utiliser les emplacements négatifs, qui comptent à partir de la fin de la liste.

Ainsi, -1 est la position du dernier élément. -2 est l'avant dernier élément et ainsi de suite.

 #!ruby

 puts soap_brand[-1]

tableau + tableau

Les tableaux peuvent être ajouter entre eux avec le signe plus. Un nouveau tableau est retourné

avec les éléments de la première liste, suivis de ceux de la seconde liste.

 #!ruby

 robots = ["Trurl", "Klapaucius"] + ["R2-D2", "C-3PO"]

 robots  #=> ["Trurl", "Klapaucius", "R2-D2", "C-3PO"]

tableau - tableau

Les tableaux peuvent aussi être soustraits! Un nouveau tableau est crée avec tout ce qui se trouve dans le

premier tableau moins tout ce qui se trouve aussi dans le second tableau.

 #!ruby

 numbers = [1, 2, 3, 4, 5, 6]

 evens = [2, 4, 6]

 numbers - evens  #=> [1, 3, 5]

<< un Object

Le double signe < ajoute n'importe quel objet à la fin d'un tableau. Il est souvent appelé "le concatenateur"

 #!ruby

 fruit = ["pommes", "mangues"]

 fruit << "ananas"

 fruit.length   #=> 3

[ position: un nombre ]

Récupère l'élément à un certain emplacement. Un tableau commence à zero, donc array[0] te donnera le

premier élément du tableau.

 #!ruby

 huxtables = ["Heathcliff", "Clair", "Denise", "Theo", 

              "Vanessa", "Rudy"]

 huxtables[0]     #=> "Heathcliff"

 huxtables[-1]    #=> "Rudy"

Comme le montre la dernière ligne, le positionnement négatif peut être utlisé.

Si rien n'est trouvé à cet emplacement, nil est retourné.

[ position: un nombre ] = un Objet

Tu peux placer un objet à un endroit précis grâce au signe égal placé après le crochet.

 #!ruby

 list = ["faire un jogging", "aller nager"]

 list[1] = "nage annulée"

Si rien n'est à cet emplacement, nil est retourné.

[ de: un nombre .. à: un nombre ]

Fait un nouveau tableau à partir d'une petite partie de ce même tableau. Commence à partir du de

et va jusqu'à l'emplacement indiqué par à.

 #!ruby

 sites = [:H, :A, :C, :K, :E, :T, :Y]

 sites[2..-2]    #=> [:C, :K, :E, :T]

Cet exemple commence à la position 2 (où est le :C) et garde tout jusqu'à la position -2,

qui est l'avant dernier objet du tableau (le :T).

S'il t'arrive d'indiquer des nombres qui dépassent la fin du tableau, Ruby s'arrêtera à la fin.

Si rien n'est trouvé entre ces emplacements, tu récupéreras un nil (comme dans "rien n'a été trouvé.")

[ départ: un nombre, combien: un nombre ]

Fabrique un nouveau tableau par extraction de certains éléments de ce tableau. Cela commence à l'emplacement

indiqué par départ et récupère le nombre d'éléments précisé par combien.

 #!ruby

 sites = ["yahoo.com", "google.com", "msn.com", "technorati.com"]

 sites[1, 2]    #=> ["google.com", "msn.com"]

Cet exemple commence à la position 1 (où se situe "google.com") et place deux éléments dans le nouveau tableau.

Si tu cherches à saisir quoique ce soit au delà de la fin du tableau, Ruby s'arrêtera à la fin de celui-ci.

Si rien n'est trouvé à partir du point de départ, tu récupèreras un nil.

at( position: un nombre )

Obtenir un élément à une certaine position. Fonctionne exactement comme array[position], décrite plus avant.

 #!ruby

 huxtables = ["Heathcliff", "Clair", "Denise", "Theo", 

              "Vanessa", "Rudy"]

 huxtables.at(0)     #=> "Heathcliff"

 huxtables.at(-1)    #=> "Rudy"

clear()

Vide le tableau. Évidemment, tu peux le remplir à nouveau.

 #!ruby

 list = File.readlines('README.txt')

 list.clear    #=> []

collect() { |éléments| ... }

Un bloc doit être attaché à la méthode collect. Le bloc boucle dans le tableau et place chaque

éléments dans la boucle. Quoi que retourne le bloc, l'élément est remis dans un nouveau tableau,

à la même position. C'est une super manière d'éditer chacun des éléments d'un tableau!

 #!ruby

 dogs = ["Pluto", "Astro", "Benji", "Lassie"]

 updogs = dogs.collect { |item| item.upcase }

 updogs

  #=> ["PLUTO", "ASTRO", "BENJI", "LASSIE"]

 dogs

  #=> ["Pluto", "Astro", "Benji", "Lassie"]

Cela ne change donc pas le premier tableau. Tu vois? Cela fait juste un nouveau tableau, à partir de l'ancien.

Si tu veux faire une copie légérement différente d'un tableau, collect (aussi appelée map)

est l'endroit à connaître pour démarrer.

collect!() { |item| ... }

Tout comme la méthode collect ci dessus: le bloc manipule chaque élément du tableau

et le modifie.

Mais à la place de faire un nouveau tableau, il change le tableau existant. C'est pour cela que cette

méthode possède un point d'exclamation. C'est dangereux: cela va remplacer tout ce qui est dans le tableau!

 #!ruby

 dogs = ["Pluto", "Astro", "Benji", "Lassie"]

 dogs.collect! { |item| item.length }

 dogs

  #=> [5, 5, 5, 6]

Tu vois, le tableau à écrit réécrit. Avec la taille de chacun des éléments. Et d'une dangereuse façon:

tous les noms de chiens... sont partis.

compact()

Retire tous les nils du tableau. Pour le cas où tu veux uniquement des choses consistantes.

C'est vrai, à quoi sert nil ici?

 #!ruby

 ["a", nil, "b", nil, "c", nil].compact

  #=> ["a", "b", "c"]

concat( an Array )

Ajoute un tableau à la fin.

 #!ruby

 ["canards", "mule"].concat( ["moutons", "chats"] )

  #=> ["canards", "mule", "moutons", "chats"]

Tu peux aussi utiliser += pour faire la même chose.

 #!ruby

 animals = ["canards", "mule"]

 animals += ["moutons", "chats"]

delete( un Objet )

Efface d'un tableau tout ce qui est égale à l'objet qui lui est passé.

delete_if { |élément| ... }

Un bloc est attaché à delete_if qui parcourt chaque élément du tableau.

Si le bloc retourne nil ou false, alors l'élément est effacé du tableau.

Un nouveau tableau est alors crée, sans les objets qui ont été supprimés.

Donc: array.delete_if { nil } efface tout!

Et: array.delete_if { |x| x.even? } efface aussi les nombres

dans une liste entièrement faite de nombres.

each { |élément| ... }

Une des choses les plus courantes que tu puisses faire avec un tableau

est d'utiliser la méthode each. Le bloc attaché va récupérer chaque éléments du tableau,

un par un, dans l'ordre. Ce qui est bien avec cette méthode, c'est que tu n'as pas besoin

de connaître la longueur du tableau, each commencera au début et arrêtera à la fin.

Par exemple, si tu veux afficher chaque éléments présent dans un tableau:

 #!ruby

 array.each { |élément| puts élément }

En programmation, ce concept d'exploration d'une liste d'un bout à l'autre s'appelle une "boucle".

first()

Retourne le premier élément d'un tableau. Tout simple!

include?( un Objet )

Recherche un objet dans un tableau. Il demande, "est-ce que cet objet est inclu dans ce tableau?" et

retourne la réponse sous la forme true ou false.

 #!ruby

 robots = ["Trurl", "Klapaucius", "R2-D2", "C-3PO"]

 robots.include?("R2")       #=> false

 robots.include?("R2-D2")    #=> true

index( un Objet )

Lorsque tu recherche la position d'un objet dans une liste.

La méthode index fait exactement cela. Si elle trouve l'objet dans le tableau, elle retournera

l'indice correspondant à sa position.

Sinon, tu obtiendras un nil. Ce qui signifie "rien n'a été trouvé".

 #!ruby

 animals = ["ours", "lapins", "panthères"]

 animals.index("lapins")  #=> 1

 animals.index("MAMMOUTHS") #=> nil

join( séparateur: une chaîne )

Génère une chaîne à partir d'un tableau. La chaîne séparatrice sera placée entre chaque éléments.

 #!ruby

 ["ours", "lapins", "panthères"].join(" & ")

   #=> "ours & lapins & panthères"

Tu vois, c'est pratique pour mettre des phrases ensemble.

last()

Retourne le dernier élément de le tableau. Au cas où tu serais curieux.

length()

Quelle est la taille du tableau? La méthode length retourne un nombre. Zero si la taille est nulle.

map() { |élément| ... }

Un raccourcis pour collect, décrite plsu haut dans cette page.

map!() { |élément| ... }

Un autre raccourics pour collect!. Vérifie, c'est un peu plus haut dans cette page.

reverse()

Génère un nouveau tableau avec tous les éléments dans l'ordre inverse. Donc si tu as une liste

d'entrées de blog allant du plus récent au plus ancien, tu peux utiliser cela pour passer

au tri allant du plus ancien au plus récent.

 #!ruby

 Table('Blog').recent(10).reverse()

Ca marche aussi bien avec sort(). Si tu désires une liste de A à Z, tu peux l'inverser de Z à A.

 #!ruby

 cats = ["Sylvester", "Boo", "Tom"]

 cats.sort().reverse()

   #=> ["Tom", "Sylvester", "Boo"]

sort()

Renvoie un nouveau tableau avec son contenu trié. Pour la plupart des choses, cela fonctionne simplement.

Les chaînes sont triées alphabetiquement. Les nombres sont triés à partir de zéro.

 #!ruby

 cats = ["Sylvester", "Boo", "Tom"]

 cats.sort()

   #=> ["Boo", "Sylvester", "Tom"]

Comment connaît-il la façon de trier les choses alors?? Et bien, il utilise la méthode vaisseau spatial!

La méthode vaisseau spatial ressemble à ceci: <=>. Elle est utilisée pour dire comment ordonner les choses.

 #!ruby

 "Sylvester" <=> "Boo"

   #=> 1

Une réponse 1 signifie que l'élément ne fonctionne pas.

Donc "Boo" doit être placée avant.

Quoi qu'il en soit, la chose importante ici est: tout ce qui possède la méthode vaisseau spatial

peut être trié.

to_a()

Retourne l'élément en tant que tableau.

to_ary()

Encore une fois, retourne l'élément en tant que tableau. Pas besoin de le transformé en tableau,

c'en est déjà un.

to_s()

Transforme le tableau en une nouvelle chaîne en appellant join(). Puisqu'il n'y a pas de séparateur, tous les

éléments sont envoyés ensemble dans la nouvelle chaîne.

 #!ruby

 animals = ["ours", "lapins", "panthères"]

 animals.to_s  #=> "ourslapinspanthères"

Dir

Dir est l'abbréviation de "directory", répertoire en Français. Ce qui signifie: un dossier de ton

disque dur. Utilise Dir pour lister les fichiers présent dans les dossiers.

 #!ruby

 Dir["#{DOWNLOADS_DIR}/*"].each do |nomdefichier|

   puts nomdefichier

 end

Il n'y a vraiment que deux choses courantes que tu puisses faire avec Dir. Dans

l'exemple précédent, nous avons listé tous les fichiers en utilisant une variable "globale".

Tu peux aussi créer de nouveaux dossiers avec Dir.mkdir.

Dir[ globale: une chaîne ]

Liste des fichiers dans un répertoire. Tu récupère un tableau de chaîne -- une liste

de nom de fichier. Il y a ici quelques petites choses à savoir.

Premièrement, tu peux utliser une étoile, qui est un caratère générique signifiant "tout fichier".

 #!ruby

 Dir["*"].each do |item|

   puts "#{item} is #{File.size(item)} bytes big"

 end

Ensuite, tu peux utiliser les accolades pour préciser une liste des mots à filtrer. Autrement

dit, si tu cherches tous les fichiers qui contiennent MP3s ou M4A:

 #!ruby

 Dir["*Ghost.{mp3,m4a}"] #=> ["Tuff Ghost.mp3", "Sea Ghost.mp3"]

Dir.mkdir( nom: une chaîne )

Crée un nouveau dossier vide.

 #!ruby

 Dir.mkdir('C:/Hacks')

File

Un File est un fichier sur ton disque dur. Comme un fichier texte, un courriel ou un MP3 que

tu as enregistré.

Tu peux aller à l'intérieur d'un fichier en utilisant File.open. Ouvrons ici un nouveau fichier appelé "À Faire.txt":

 #!ruby

 File.open("À Faire.txt", "w") do |f|

   f << "S'approvisionner en lait de coco."

 end

Le "w" est utilisé pour demander à Ruby d'ouvrir le fichier en écriture. Tu pourras alors ajouter

un élément à ta liste de chose à faire.

La variable f dans le bloc est un objet File. Donc, une fois ouvert, le fichier

peut utiliser n'importe laquelle des méthodes ci-dessous.

 #!ruby

 insides = File.open("À faire.txt", "r") do |f|

   f.read()

 end

 puts(insides)

Le mode "r" sert à lire des fichiers.

(!) NOTE IMPORTANTE: Sous Windows, les fichiers standard sont traités comme des fichiers textes.

Si tu voulais ouvrir une image (un GIF, un JPEG) ou tout autre fichier ne contenant pas de texte pur, assure-toi

de le lire en mode binaire "rb" et d'écrire dedans en mode binaire "wb"`.

 #!ruby

 File.open("stinky-the-skunk.png", "rb") do |f|

   puts "Image is #{f.read().length()} bytes long."

 end

N'oublie pas ask_open_file et ask_save_file de la liste des fonctions pré-définies.

Elles vont bien avec les objets Fichiers!

File.basename( nom de fichier: un Chaîne )

Fournis à cette méthode le chemin complet vers un fichier (comme par exemple "C:/WINDOWS/notepad.exe") et elle te

retournera uniquement le nom du fichier, débarrassé du nom du dossier (ici, "notepad.exe".)

 #!ruby

 comics = "C:/Documents and Settings/Philarp/My Documents/comics.txt"

 File.basename(comics)   #=> "comics.txt"

File.delete( nom de fichier: une chaîne )

Efface un fichier, définitivement.

 #!ruby

 File.delete("D:/Vids/Good-Burger.mov")

File.dirname( nom de fichier: une chaîne )

Fournis à cette méthode le chemin complet vers un fichier (par exemple "C:/WINDOWS/notepad.exe") et elle

te retournera le nom du dossier uniquement (ici: "C:/WINDOWS")

 #!ruby

 comics = "C:/Documents and Settings/Philarp/My Documents/comics.txt"

 File.basename(comics)   #=> "C:/Documents and Settings/Philarp/My Documents"

File.exists?( nom de fichier: une chaîne )

Vérifie qu'un fichier est vraiment là, sur ton disque dur. Puisqu'elle possède un

point d'interrogation -- est-ce vrai? -- tu récupères simplement true ou false.

 #!ruby

 if File.exists?("C:/corn-cob.png")

   puts "Pourquoi gardes-tu les images d'épis de maïs couchés - je ne le saurai jamais."

 end

File.join( une chaîne, une chaîne, ... )

Assemble un nombre quelconque de chaînes, en ajoutant un slash entre chaque. C'est donc un

bonne façon de construire des noms de fichiers.

 #!ruby

 File.join("C:", "Robots", "Trurl.txt")

   #=> "C:/Robots/Trurl.txt"

File.open( nom de fichier: une Chaîne, mode: "r", "w", "rb" or "wb" ) { |file| ... }

Ouvre un fichier en lecture ou écriture. Utilise "r" pour lire depuis un fichier de texte standard ou

"w" pour écrire dans un fichier texte. Ajoute le "b" pour lire et écrire depuis un fichier binaire

(des choses comme les images, les MP3s, qui ne contiennent pas du texte plein.)

 #!ruby

 # Ce programme sauvegarde tous les messages du salon lobby de Why.

 c = Hacker('why').channel('lobby')

 loop do

   f = File.open("C:/Chat.txt")

   chan.hear.each do |m|

     f.write "#{m.hacker} said at #{m.at}:\n#{m.object}\n"

   end

   f.close

   sleep 5

 end

Encore mieux, tu peux utiliser un bloc pour automatiquement fermer le fichier à ta place.

Tu as vu comment j'ai utilisé close après avoir écrit dedans? Si tu utilises un block, le fichier se fermera lorsque tu atteindras la fin du bloc.

Comme ceci:

 #!ruby

 File.open("C:/Chat.txt") do |f|

   chan.hear.each do |m|

     f.write "#{m.hacker} said at #{m.at}:\n#{m.object}\n"

   end

 end

L'utilisation du block est sans équivalent, utilise le sans hésitation!

File.rename( depuis: une chaîne, jusqu'à: une chaîne )

Change le nom d'un fichier. Le déplace.

 #!ruby

 File("basil-kirchin.mp3", "Quantum-Part-1.mp3")

Ceci va renommer le MP3 basil-kirchin.mp3 en Quantum-Part-1.mp3, son nouveau nom. Très pratique pour tes collections de musique et de photos.

File.size( nom de fichier: une chaîne )

Mesure la taille d'un fichier, en octets.

 File.size("Adventure Time.flv")

   #=> 18814749

La taille de Adventure Time.flv est donc de 18,814,749 octets. Ou, en gros, 18 mégaoctets.

<< un chaîne

Écrit un message dans le fichier ciblé par les doubles flèches. C'est la même chose qu'utiliser

write, mais c'est pratique pour ceux d'entre vous qui aiment les symboles visuels plutôt que les mots.

 #!ruby

 File.open("FavoriteTreats.txt", "w") do |f|

   f << "Pickle Surprise"

 end

close()

Ferme le fichier. Ceci indique à l'ordinateur que tu en as terminé avec le fichier et que tu passes à autre chose. Une bonne raison de fermer un fichier est de laisser d'autre programmes l'utiliser.

 #!ruby

 f = File.open("GiraffeNames.txt")

 puts "J'aime les noms de giraffes. Par exemple:"

 puts f.read

 f.close

 puts "Elles sont toutes là!"

Si tu utilise un bloc, If you're using a block, alors ne te soucie de rien! Le bloc fermera le fichier pour toi. Consulte l'aide de File.open, si tu veux voir un exemple.

read()

Stock tout dans le fichier sous forme de chaîne.

 #!ruby

 File.open("GiraffeNames.txt") do |f|

   names = f.read

 end

Considère que GiraffeNames.txt est un fichier texte plein. Comme ceci:

 Chopsy

 McCoy

 Beanback

 Shlomi

Et nous le bidouillons comme ceci:

 #!ruby

 f.read

   #=> "Chopsy\nMcCoy\nBeanback\nShlomi\n"

 f.read

   #=> ""

La méthode read demarrera au début du fichier et le lira jusqu'à la fin. Ce qui veux dire que si tu tente de lire (read) après qu'il ait atteint la fin,

tu n'obtiendras rien en réponse.

Essaie d'utiliser la méthode rewind pour revenir au début et recommencer à nouveau.

Oh, encore une chose: tu peux read un chiffre. Et il s'arrêtera après avoir lu ce nombre de lettres. Ou octets, devrais-je dire.

 #!ruby

 f.read(6) # lit seulement des six premières lettres

   #=> "Chopsy"

readlines()

Tout comme read, nous récupérons le fichier en entier. Mais cette fois en tant que tableau plein de chaînes. Et chaque chaîne contient une ligne du fichier.

Utilisons le fichier GiraffeNames.txt mentionné dans l'exemple read ci-dessous:

 #!ruby

 f.readlines

   #=> ["Chopsy\n", "McCoy\n", "Beanback\n", "Shlomi\n"]

 f.readlines

   #=> []

rewind()

Retourne au début du fichier. Lorsque tu ouvres un fichier, tu commences toujours en haut, tu n'as donc pas à l'utiliser à moins d'avoir déjà fait quelques lectures ou écritures.

 #!ruby

 f.read

   #=> "Chopsy\nMcCoy\nBeanback\nShlomi\n"

 f.rewind

 f.read

   #=> "Chopsy\nMcCoy\nBeanback\nShlomi\n"

write( texte: une chaîne )

Ajoute la chaîne texte au fichier. Regarde aussi la méthode << un peu avant, c'est la même chose.

 #!ruby

 File.open("FavoriteTreats.txt", "w") do |f|

   f.write "Pickle Surprise"

 end

Fixnum

Un Fixnum est un chiffre. 1, 2 et 3. Et ainsi de suite!

Oh, et aussi les chiffres négatifs.

 #!ruby

 4 + 6      # ajoute

   #=> 10

 14 - -2    # soustrait

   #=> 16

 12 / 2     # divise

   #=> 6

 200 * 3    # multiplie

   #=> 600

Heureusement tu n'auras pas à faire beaucoup de math, quoi que. Le plus souvent, tu utiliseras un chiffre pour répéter un bloc de code encore et encore, en utilisant la méthode times.

Comme par exemple, pour répeter un bloc cinq fois:

 #!ruby

 5.times do

   puts "Odelay!"

 end

Ce qui affichera Odelay''' cinq fois. Bien, très facile à comprendre.

Une autre chose qui peut être bien pratique. Si tu as un nombre dans une variable, tu peux l'augmenter avec le signe +=.

 #!ruby

 num = 6

 num += 1

  # À présent `num` vaut 7

La plupart des langages utilisent ++ pour cela. Mais oublie cela pou l'instant, d'accord?

abs()

Retire le signe négatif. Cela s'appelle la "valeur absolue" d'un nombre.

 #!ruby

 -16.abs

   #=> 16

downto( fin: un nombre ) { |nombre| }

Compte depuis ce nombre jusqu'au nombre à la fin. À chaque boucle,

le nombre juste en dessous est passé au bloc.

 #!ruby

 puts "Compte à rebour:"

 10.downto(1) do |nombre|

   puts "#{nombre}!!"

 end

 puts "Yay, mon chapeau est en feu à présent."

times { |nombre| }

Compte à partir de zéro jusqu'au nombre. À chaque comptage, le bloc prends le nombre où nous sommes.

 #!ruby

 5.times do |i|

   puts "Odelay!! (#{i})"

 end

to_s()

Convertit un nombre en chaîne de façon à pouvoir l'afficher à l'écran ou le stocker dans une table ou autre.

 #!ruby

 5.to_s

   #=> "5"

upto( haut: un nombre ) { |nombre| }

Compte à partir de ce chiffre jusqu'au nombre précisé en haut. À chaque comptage, tu obtiens le numéro suivant sur l'échelle, qui est donné au bloc.

 #!ruby

 puts "Compter:"

 1.downto(10) do |nombre|

   puts "#{nombre}!!"

 end

 puts "JE SUIS UN CHAMPION."

Hash

Un hachage est un dictionnaire de paires. Ce qui signifie: il apparie les choses. Tu seras surpris de sa fréquente utilisation.

Comme à chaque fois que tu vois cela:

 #!ruby

 Web.fetch('http://metafilter.com', :as => Web::Feed)

La dernière partie est un hachage. La partie qui dit: :as => Web::Feed.

On peut aussi l'écrire comme cela:

 #!ruby

 Web.fetch('http://metafilter.com', {:as => Web::Feed})

Quand tu construis une hachage à l'extérieur d'une méthode, tu utiliseras les accolades ouvrantes et fermatnes:

 #!ruby

 livre = {

   "Les aventures de Gulliver" => :excellent,

   "Une paix séparée" => :ennuyeux,

   "Le bûcher des vanités" => :pas_mon_style

 }

Regarde, voici un bon exemple d'un hachage utile. Ce dictionnaire apparie un titre de livre avec mon sentiment sur ce livre. Je peux faire un grand dictionnaire de tous les livres que j'ai lu et de mes impressions.

Ensuite, lorsque je veux examiner un livre en particulier:

 #!ruby

 books["Une paix séparée"]

   #=> :ennuyeux

Les crochets peuvent être utilisés pour examiner le nom d'un livre.

Le plus souvent, dans Hackety Hack, tu conserveras des choses comme cela dans une table. Mais les tables peuvent être chargées dans un dictionnaire.

Utiliser des dictionnaires comme des espaces de stockage temporaires est chose très courante.

(!) NOTE IMPORTANTE: N'attend pas d'un hachage qu'il conserve les choses dans l'ordre!! Les dictionnaires ne s'occupent pas de la façon dont les choses sont ordonnées. Utilise un tableau pour classer beaucoup de chose et un hachage pour en apparier deux.

Encore une fois, pense à l'exemple du livre. L'ordre des livres m'importe peu. Je veux simplement trouver rapidement quelle impression j'ai attribué à certain livre.

[ consultation: un objet ]

C'est le but principal d'un hachage. Pour consulter un élément d'un dictionnaire.

Les hachages sont stocker par paires. Cela s'appelle une paire de clef-valeur.

La clef est à la gauche de laflèche, la valeur à droite.

Regarde:

 #!ruby

 livres = {"Voyages de Gulliver" => :excellent}

La clef est "Voyages de Gulliver". La valeur est :excellent.

La belle affaire! Bon, lorsque tu recherches une choses, tu consulte sa clef. Exactement comme dans un vrai dictionnaire. TU as un mot et une définition dans le dictionnaire Larousse. Tu le consultes en cherchant un mot, pas sa définition.

Pour consulter le commentaire d'un livre, on utilise la clef:

 #!ruby

 books["Voyages de Gulliver"]

   #=> :excellent

Si rien ne correspond à ta recherche, nil est retourné. Autrement dit,

"rien n'a été trouvé."

[ clef: un objet ] = valeur: un objet

Voici une façon rapide d'ajouter quelquechose à un hachage. Lance une consultation, mais ajoute à ta recherche le signe égale.

 #!ruby

 books = {}

 books["Catch 22"] = :bien

delete( clef: un objet )

Efface (Delete) une entrée du hachage. Utilise la clef, exactement comme une consultation, pour dire à Ruby quelle entrée effacer.

 #!ruby

 livres = {"Alice au pays des merveilles" => :phénomenal}

 livres.delete("Alice au pays des merveilles")

   #=> :phénomenal

 livres["Alice au pays des merveilles"]

   #=> nil

each { |clef, valeur| }

Si tu veux parcourir chaque entrées du dictionnaire, utilise each.

Le bloc associé va prendre chacunes des paires du hachage, une par une,

sans ordre particulier.

Ainsi, si par exemple tu veux afficher chaque paire du dictionnaire:

 #!ruby

 livres.each do |clef, valeur|

   puts "KEY: #{clef}"

   puts "VALUE: #{valeur}"

   puts

 end

En programmation, cette façon de parcourir cycliquement, du début à la fin, est appelé une "boucle".

empty?()

Est-ce que ce distionnaire contient des entrées? Si oui, tu obtiendras un false (faux) par retour.

si non, true (vrai).

has_key?( clef: un objet )

Vérifie que le dictionnaire possède une key (clef). Cela revien à faire une consultation, mais avec des réponses true ou false.

 #!ruby

 books.has_key?("CivilWarLand in Bad Decline")

   #=> false

 books.has_key?("Voyages de Gulliver")

   #=> true

C'est très pratique si tu veux être certain que tu n'obtiendras pas un nil après une consultation.

index( valeur: un objet )

Ne cherche pas la clef mais sa valeur. Si tu veux trouver un livre qui à qui j'ai donné un :bon classement:

 #!ruby

 books.index(:bon)

   #=> "Catch 22"

keys()

Construis un tableau à partir de toutes les clefs du dictionnaire. Si tu utilises l'analogie avec le dictionnaire, ceci donne la liste de tous les mots du dictionnaire qui ont une définition.

Dans le cas de notre exemple, une liste de tous les livres commentés:

 #!ruby

 books.keys

   #=> ["Voyages de Gulliver", "Une paix séparée", "Le bûcher des vanités"]

length()

Combien de paires sont dans ce dictionnaire? Un nombre est retourné.

 books.length

   #=> 3

Ah, j'ai donc commenté trois livres.

merge( dictionnaire2: un dictionnaire )

Combine ce dictionnaire avec un autre dictionnaire. Tu obtiens un nouveau dictionnaire qui mélange les deux. Cepedant, si une clef est trouvée dans le premier dictionnaire et qu'elle est aussi dans le second, alors cette dernière écrasera la première clef.

 #!ruby

 nos_livres = mes_livres.merge(livres_de_Dave)

Dans l'exemple précédent, mes livres et ceux de Dave sont combinés dans un unique dictionnaire des commentaires. Si Dave à commenté les Voyages de Gulliver, sont commentaire survivra alors que le mien disparaîtra.

merge!( dictionnaire2: un dictionnaire )

Combine les dictionnaires, tout comme merge, mais sans créer de nouveau dictionnaire. Le second hachage est simplement fusionné dans le premier.

 #!ruby

 mes_livres.merge!(livres_de_Dave)

sort()

Tri alphabetiquement les clefs du dictionnaire, en convertissant le hachage en tableau, ou les choses conservent leur ordre.

Donc, pour afficher mes commentaires classé alphabetiquement:

 #!ruby

 livres.sort.each do |titre, classement|

   puts "#{titre} à été noté: #{classement}"

 end

Objet

Tout -- nombres, chaînes, tabelaux, etc. -- est un objet. Toutes ces méthodes peuvent donc être utilisées sur n'importe quel objet! Y compris cette page.

Un objet est simplement une chose vide. Tu n'utiliseras probablement jamais un objet à lui seul.

 #!ruby

 Object.new

   #=> (Object)

Tu vois, rien. Pas tellement utile.

objet == objet

Est-ce que ces deux objets sont les mêmes? Le signe double-egal est largement utilisé dans Ruby. Tu peux tester deux objets pour voir s'ils sont identiques.

  • nom == "Philippe" -- est-ce que la variable nom contient une chaîne qui dit "Philippe"?
  • code_postal == 34143 -- est-ce que la variable code_postal contient le nombre 34143?

Ceci est habituellement combiné à un if (si).

 #!ruby

 if nom == "Philippe"

   puts "Ah, je t'attendais."

 end

class()

T'indique à quelle classe appartient cet objet. Est-ce que c'est une chaîne? Ou un hachage?

Ou une Image?

 #!ruby

 "".class

   #=> String

 {}.class

   #=> Hash

 Picture("icon.png")

   #=> Picture

dup()

Fait une copie de cet objet. Lorsque tu créer quelquechose, comme une chaîne ou un tableau, tu en fait seulement un exemplaire. Au fil de ton programme, tu peux vouloir modifier cet objet ou le placer dans de nouvelles variables. Mais il n'y a toujours qu'un seul objet réel, avec des surnoms différents.

La méthode dup fait une copie de l'objet, pour le cas ou tu voudrais travailler avec une copie plutôt que de modifier l'objet de façon permanente.

 #!ruby

 soda = "Coca Cola"

 pop = soda.dup

 pop += "!"

   #=> "Coca Cola!"

 soda

   #=> "Coca Cola"

inspect()

Encore une autre méthode cruciale, à mon avis. Cette méthode transforme n'importe quel objet en une chaîne. Cette chaîne décrit habituellement tout ce qui peut l'être pour l'objet. Donc, pour les hachages, tu obtiens une liste de toutes les paires à l'intérieur du hachage. Et pour les objets, tu verras une liste de ses variables.

 #!ruby

 {"Eau" => "Claire", "Lait" => "Blanc"}.inspect

   #=> "{\"Eau\" => \"Claire\", \"Lait\" => \"Blanc\"}"

 Object.new.inspect

   #=> "(Object)"

La plupart du temps, tu n'utiliseras pas cette méthode directement. Tu utilisera plutôt la méthode pré-définies appelée p.

is_a?( classe )

Vérifie si l'objet appartient à une certaine classe. Tu obtiens encore true ou false, comme avec toutes les méthodes possédant un point d'intérrogation.

 #!ruby

 "Spiderman".is_a?(String)

   #=> true

 {"Bone" => "Jeff Smith"}.is_a?(Array)

   #=> false

object_id()

C'est un nombre unique qui caractérise cet objet. Tu ne devrais beaucoup l'utiliser, mais c'est important de savoir que Ruby attribue à chaque objet son propre numéro.

respond_to?( méthode: un symbole )

Celle-ci est incroyablement utile!! respond_to? vérifie si l'objet peut avoir certaine méthode associée.

Donc, si tu as une variable, et que tu veux savoir si elle peut être modifiée en utilisant la méthode reverse:

 #!ruby

 obj.respond_to?(:reverse)

   #=> false

Oh, elle ne peut pas être renversée. Donc on ne fait pas.

Cette méthode retourne true ou false, c'est donc pratique avec un if.

Regexp

Regexp est un raccourcis pour "regular expression", expressions régulière. Une Regexp sert à trouver un motif dans des mots ou des paragraphes.

Ces ventouses ne sont pas pour le faible du coeur!

Une expression régulière est habituellement entourée de slashes:

 #!ruby

 r = /^image:/

Cette expression régulière trouve n'importe quelle chaîne qui commencant par les lettres "image:". Le symbole ^ représente le début de la ligne.

C'est ce qui rend les expressions régulières si puissantes: tous les symboles spéciaux qui représentent des choses différentes. Les expressions régulières sont réellement un petit langage à part entière.

Écrire des Expressions Régulières

Voici les symboles importants:

  ^  trouve le début d'une ligne

  $  trouve la fin d'une ligne

  .  trouve n'importe quel caractère

  \d trouve un nombre

  \w trouve une lettre, un nombre ou un _

  \s trouve une espace, une tabulation, ou une nouvelle ligne

  \S trouve tout ce qui n'est pas une espace, une tabulation, une nouvelle ligne

Donc si tu veux trouver un code-postal à 5 chiffres: /\d\d\d\d\d/

Ou, si tu veux vérifier si une chaîne se termine avec ".mp3": /\.mp3$/

Remarque comment je place un antislash devant le point. Normalement, un point est un symbole qui trouve n'importe quoi. Mais si je fais un antislash-point \., alors le point sera en fait trouvé.

Raccourcis

Voici un raccourcis pour trouver des codes-postaux facilement: /\d{5}/

Le {5} signifie "trouve le dernier symbole 5 fois". Le dernier symbole était \d qui signifie "un nombre". Donc, au final: "trouve un nombre 5 fois."

Voici quelques autres raccourcis:

 {3}   trouve 3 fois

 {3,}  trouve 3 fois ou plus

 {3,5} trouve entre 3 et 5 fois

 *     trouve zero fois ou plus

 +     trouve une fois ou plus

 ?     trouve zero ou une fois

À présent tu peux écrire des expressions régulières vraiment stupéfiantes. Par exemple, pour récupérer le premier mot dans une phrase: /^\w+/

Exemples

Voici quelques exemples courants:

 #!ruby

 "pinball.mp3"[/\.\w+$/]         # trouve l'extension du fichier

   #=> ".mp3"

 "map:Seattle, WA"[/^map:(.+)/, 1]  # trouve tou ce qui est après "map:"

   #=> "Seattle, WA"

match( une chaîne )

Essaie de trouver cette expression régulière une seule fois dans unes chaîne. Si une correspondance est trouvé, tu obtiens un objet MatchData. Continue et converti ceci en tableau, en utilisant to_a:

 match = /^map:(.+)/.match("map:Seattle, WA").to_a

   #=> ["map:Seattle, WA", "Seattle, WA"]

Si aucune correspondance n'est trouvée, tu obtiens un nil, comme dans "rien n'a été trouvé."

Je te recommande d'éviter cette méthode. Utilise plutôt une chaîne avec une consultation str[/regexp/] ou str.scan(/regexp/).

Chaîne

Un chaîne est une série de lettres. Lorsque tu charge un fichier, tu en retires une longue chaîne. Une page web n'est rien d'autre qu'une chaîne. Tout ce qui contient des mots, des phrases des paragraphes, ets une chaîne.

Même les images sont des chaînes! (Illisibles, Unreadable, ce sont des chaînes qui paraissent désordonnées.) Pour créer une nouvelle chaîne, entoure ton message de guillemet doubles.

 #!ruby

 chaine = "I quit my job blowing leaves, 

   telephone bills up my sleeves"

 puts string

Tout ce qui est entre guillemet est une chaîne, même si la chaîne se trouve sur plusieurs lignes.

Les guillemets simples fonctionnent aussi: 'comme ceci.'

<< une chaîne

Ajoute à la fin de cette chaîne.

 #!ruby

 nom = "Philarp"

 nom << " Tremaine"

 puts nom

   #=> Philarp Tremaine

Tu peux même les enchaîner si tu veux:

 #!ruby

 nom = "P"

 nom << "h" << "i" << "l"

 puts nom

   #=> Phil

chaîne + chaîne

Génère une nouvelle chaîne en combinant deux chaînes, dans l'ordre.

 #!ruby

 lettres = "abc" + "xyz"

   #=> "abcxyz"

En général, tu n'utilisera pas cela, mais plutôt cette notation.

 #!ruby

 lettres = "#{"abc"}#{"xyz"}"

   #=> "abcxyz"

La raison derrière tout cela étant que l'addition de chaîne échouera si tu as un nombre ou autre chose dedans.

 #!ruby

 abc = "abc"

 un = 1

 lettres = abc + un

   #=> [TypeError] can't convert Fixnum into String

 lettres = "#{abc}#{un}"

   #=> "abc1"

string[ à partir de: un nombre .. jusqu'à: un nombre ]

Récupère une partie de la chaîne et en fait une nouvelle.

Admettons que tu veux uniquement les lettres depuis la seconde jusqu'à la cinquième:

 #!ruby

 string[2..5]

string[ /regexp/: une expression régulière ]

Essaie de trouver une Regexp une seule fois dans la chaîne. La première correspondance trouvée est retournée (en tant que chaîne). Si rien n'est trouvé, alors nil est retourné.

 #!ruby

 "pinball.mp3"[/\.\w+$/]

   #=> ".mp3"

 "J'ai 13 lapins!!"[/\d+/]

   #=> "13"

Si tu veux obtenir une certain groupe parmis les correspondances, tu peux aussi préciser un nombre à la RegExp?:

 #!ruby

 "Seattle, WA"[/(\w+), ([A-Z]+)/, 1]

   #=> "Seattle"

 "Seattle, WA"[/(\w+), ([A-Z]+)/, 2]

   #=> "WA"

Regarde le chapitre sur les Regexp pour en savoir plus sur cette créature rare et complexe.

capitalize()

Met en lettre capitales la première lettre d'une chaîne et te retourne une copie.

downcase()

Fait une nouvelle chaîne à partir de la chaîne d'origine, mais avec toutes les lettres capitales de la chaîne transformées en lettres minuscules. "A" devient "a",

"B" devient "b", et ainsi de suite.

empty?()

Est-ce que cette chaîne est vide? Une chaîne vide est "". Si tu as affaire à une chaîne vide, tu obtiendras true. Sinon, false. Comme pour toutes les méthodes qui présentent un point d'intérrogation.

 #!ruby

 "".empty?

   #=> true

 "OK".empty?

   #=> false

include?( trouve: une chaîne )

Vérifie que la chaîne contient find quelquepart. C'est comme une mini recherche.

Puisque les descriptions d'éléments de blog sont des chaînes, nous pouvons utiliser cette méthode pour voir si l'article le plus récent sur MetaFilter? contient le mot "Colbert".

 #!ruby

 blog = Web.fetch("metafilter.com", :as => Web::Feed)

 blog.items[0].description.include? "Colbert"

   #=> false

ends?( fin: une chaine )

Est-ce que cette chaîne se termine par cette fin? Pratique pour vérifier les extensions de fichier!

 #!ruby

 "Dark Star.avi".ends?(".avi")

   #=> true

 "Dark Star.avi".ends?(".mp4")

   #=> false

length()

Combien de caractères sont dans cette chaîne? Ceci inclus les lettres, les nombres, les espaces.

 #!ruby

 "Boston".length()

   #=> 6

 "Tammany Hall".length()

   #=> 12

remove( expression: une chaîne )

Génère une nouvelle chaîne en retirant l'expression. Ceci n'enlèvera pas l'expression à chaque fois quelle apparaît, mais uniquement la première apparition de cette expression.

 #!ruby

 "Beck - The New Pollution.mp3".remove(".mp3")

   #=> "Beck - The New Pollution"

reverse()

Fait une copie de cette chaîne, en inversant tous les caractères.

 #!ruby

 "Rocky Dennis".reverse

   #=> "sinneD ykcoR"

scan( motif: une Regexp )

Parcours la chaîne, en cherchant la correspondance avec l'expression régulière autant de fois que possible. Tu obtiens en retour un tableau des correspondances.

Ainsi, par exemple, pour obtenir une liste de tous les mots dans une chaîne:

 #!ruby

 "Deux platines et un microphone".downcase.scan(/\w+/)

   #=> ["Deux", "platines", "et", "un", "microphone"]

C'est une méthode très puissante trop souvent oubliée! Disons que tu veux trouver combien de fois le mot "George" apparait dans une chaîne:

 #!ruby

 str.scan(/George/i).length

   #=> 4

Le i à la fin de la Regexp signifie case-insensitive, insensible à la casse. Elle trouvera donc toutes les correspondances avec "george", minuscules et capitales .

split( marque: une chaîne )

Ceci va casser ta chaîne en morceaux, dans un tableau. Et la coupure se fait sur la marque. C'est souvent quelque chose comme une virgule ou un point-virgule par exemple.

 #!ruby

 "Jeff, Jim, Jillian".split(",")

   #=> ["Jeff", " Jim", " Jillian"]

Tu peux aussi découper à partir d'expressions régulières. Si, par exemple, nous voulions nous débarrasser des espaces avant chaque nom:

 #!ruby

 "Jeff, Jim, Jillian".split(/\s*,\s*/)

   #=> ["Jeff", "Jim", "Jillian"]

Maintenant les espaces devant Jim et Jillian sont partis!

starts?( début: une chaîne )

Est-ce que cette chaîne commence par ce début? C'est pratique lorsque tu l'utilise en combinaison de la méthode remove. Comme si tu voulais inventer ta propre commande de clavardage.

 #!ruby

 "map:Seattle, WA".starts?("map:")

   #=> true

 "map:Seattle, WA".remove("map:")

   #=> "Seattle, WA"

Dans notre programme de messagerie, tu voudras trouver toutes les fois ou tu as saisie "map:Une Addresse". Puis tu voudras envoyer cette carte via ta messagerie en utilisant un objet Adresse.

 #!ruby

 if cmd.starts?("map:")

   # Une carte à été trouvée!

   addr = Address(cmd.remove("map:"))

   chan.say(addr)

 else

   # Normal talking, just say it.

   chan.say(cmd)

 end

strip()

Retire tous les espaces, tabulations ou nouvelles lignes au début et à la fin d'une chaîne, puis retourne une copie.

to_i()

Essaie de changer cette chaîne en nombre.

 #!ruby

 "23".to_i

   #=> 23

 "02-Blueberry_Boat.mp3".to_i

   #=> 2

Regarde bien le second exemple. Puisque le nom du MP3 commence par un nombre,

la méthode to_i va poursuivre et utiliser cela comme le nombre.

to_sym()

Créer un symbole du même nom que la chaîne. Regarde la page Symbol pour en savoir plus sur la pertinence des symboles.

 #!ruby

 "Feed".to_sym

   #=> :Feed

Même si n'importe quelle chaîne peut être transformer en symbole, tu ne devrais pas transformer de grandes chaînes en symboles. De telles choses peuvent vraiment mettre des batons dans les roues de ton travail.

upcase()

Fabrique une nouvelle chaîne à partir de cette chaîne, mais avec toutes les lettres en minuscules de la chaîne transformées en lettres capitales. "a" devient "A",

"b" devient "B", et ainsi de suite.

Symbole

Un symbole est un type très très simple de chaîne. Les symboles font que le code parait un peu plus joli. Au lieu de mettre des guillemets, place juste un double-point au début du mot et tu obtiens un :symbol!

Les symboles sont plutôt primitifs, aussi préféreras-tu sans doute éviter de les utiliser lorsque tu peux utiliser une chaîne.

Il y a deux bonnes raisons d'utiliser un symbole:

En tant que clef d'un dictionnaire. Les symboles apparaissent bien plus clairement comme clef d'un hachage.

 #!ruby

 livre = {:titre => "Mother Night", :auteur => "Kurt Vonnegutt"}

Regarde comme il est facile de voir les clefs lorsqu'elles sont notées comme symboles. Si tu as des chaînes pour les clefs, ls guillemets deviennent rapidement de trop. Tu peux évidemment utiliser des chaînes, si tu préfères, mais la plupart des gens penses que les symboles présentent une syntaxe plus propre.

 #!ruby

 livre[:titre]

   #=> "Mother Night"

Ceci s'applique aussi lorsque tu utilises des méthodes dont la syntaxe se rapproche de celle des hachages.

 #!ruby

 Web.fetch("metafilter.com", :as => Web::Feed)

Dans la définition de classe. Ceci s'applique aux utilisateurs plus avancés. Parfois tu utiliseras des méthodes telles que attr_accessor ou define_method. Ces méthodes sont aussi plus lisibles avec des symboles.

 #!ruby

 class Creature

   attr_accessor :life, :strength, :charisma, :weapon

 end

Donc, en résumé: les symboles sont super pour les clefs de dictionnaire ou lorsque elles apparaissent dans les définitions de classes et sont uniquement utilisés pour que le code soit plsu clair.

to_s()

Génère une chaîne avec le nom du symbole.

 #!ruby

 :Feed.to_s

   #=> "Feed"

Time

Un objet Time contient un format spécifique de date et de temps, de l'ordre de la milliseconde. Et aussi des information sur la zone horaire.

Tu peux toujours obtenir la date précise avec Time.now!

 Time.now

   #=> Mon Apr 16 09:10:01 -0400 2007

Tu verras aussi le temps utilisé pour les messages dans les salons de discussion de Hackety Hack.

Tout comme dans un message, la méthode at indique l'heure d'envoi du message.

 #!ruby

 chan.hear.each do |m|

   puts m.at

 end

Normalement, tu ne chercheras pas à modifier les objets Time. Tu voudras simplement les changer en chaînes de caractères. Les objets Times propose différents formats..

 #!ruby

 Time.now.calendar

   #=> "April 16th, 2007"

 Time.now.calendar_with_time

   #=> "April 16th, 2007 at 6:27 PM"

 Time.now.time_only

   #=> "6:27 PM"

 Time.now.quick

   #=> "Apr 16, 2007 at 6:27pm"

 Time.now.short

   #=> "2007-04-16"

 Time.now.full

   #=> "2007-04-16 18:27:57"

Une autre méthode courante est la méthode since (depuis), qui indique la durée écoulée à partir d'un instant donné.

 #!ruby

 Time.local(2001, 9, 11).since

   #=> "5 years"

 Time.now.since

   #=> "less than a minute"

Time.local( année, mois, jour, heure, minute, seconde, milliseconde )

Crée un nouvel objet Time pour ta zonde horaire locale. Cette méthode prend plusieurs nombres, en commencant par l'année pour aller jusqu'à la milliseconde.

 #!ruby

 Time.local(2007)

   #=> Mon Jan 01 00:00:00 -0400 2007

 Time.local(2001, 9, 11)

   #=> Tue Sep 11 00:00:00 -0400 2001

Comme tu peux le voir, tu peux oublier des nombres. Si tu indique un seul nombre, il considérera le premier jour et la première seconde de cette année. Si tu précises quatre nombres, Ruby te donnera la première seconde de cette heure pour cette date.

Time.now()

Donne l'heure courante. Tout de suite.

calendar()

Transforme le temps en chaîne au format "Mois Jour Année".

Ceci est tout indiqué pour afficher une date lisible, comme celle que tu lis sur un journal ou sur un calendrier.

 #!ruby

 Time.now.calendar

   #=> "April 16th, 2007"

calendar_with_time()

La date calendaire de la méthode calendar avec l'heure à la fin.

 #!ruby

 Time.now.calendar_with_time

   #=> "April 16th, 2007 at 6:27 PM"

full()

Une chaîne complète de date, aussi courte que possible, et au format:

ANNÉE-MOIS-JOUR HEURES:MINUTES:SECONDES. L'affichage de l'heure est au format "24 heures".

 #!ruby

 Time.now.full

   #=> "2007-04-16 18:27:57"

quick()

Une chaîne complète de date avec le nom du mois abrégé, d'encombrement limité. Pratique pour les blogs et les forums, où les dates doivent restées compactes.

 #!ruby

 Time.now.quick

   #=> "Apr 16, 2007 at 6:27pm"

short()

Une abbréviation de la date au format ANNÉE-MOIS-JOUR.

 #!ruby

 Time.now.short

   #=> "2007-04-16"

time_only()

Retourne une chaîne à partir de l'heure, avec AM et PM, et sans préciser le jour, le mois ou l'année.

 #!ruby

 Time.now.time_only

   #=> "6:27 PM"

zone()

Le nom de la zone horaire que représente cet objet Time.

 #!ruby

 Time.now.zone

   #=> "EST"

URI

Une URI est une adresse web. Tu auras probablement affaire aux URIs (aussi appelées URLs) à l'occasion et cette classe rend la chose un peu plus aisée.

Par exemple, tu dois parfois mettre une URI à part. Prenons cette recherche Google:

 http://www.google.com/search?hl=en&q=Hackety+Hack&btnG=Search

Quel bazard! Tu ne peux pas en faire grand chose. Organisons là:

 #!ruby

 uri = URI("http://www.google.com/search?hl=en&q=Hackety+Hack&btnG=Search")

 puts uri.host

   #=> "www.google.com"

 puts uri.path

   #=> "/search"

 puts uri['q']

   #=> "Hackety Hack"

Beaucoup mieux! Maintenant tu peux voir le host(hôte) et le path (chemin) de l'URI. La meilleure partie reste la dernière ligne, où la clef q est extraite de l'URI.

La clef q est la partie de la chaîne Google où sont conservés les termes de la recherche.

Un autre exemple est l'URI YouTube?:

 http://youtube.com/watch?v=on7btklYzX4

La clef v de l'URI contient le code de la vidéo:

 #!ruby

 uri = URI("http://youtube.com/watch?v=on7btklYzX4")

 puts uri['v']

   #=> "on7btklYzX4"

La bibliothèque Web

La bibliothèque Web contient des méthodes pour télécharger des fichiers et récupérer des informations sur le web.

Bien qu'elle soit vraiment minuscule, la bibliothèque web embarque:

  • des méthodes Downloads qui enregistrent les fichiers internet ou lisent des flux de nouvelles.
  • des méthodes Search pour obtenir les résultats des recherches Google et Yahoo.
  • et, les classes Page Web pour faire tes propres pages web et les afficher rapidement.

Download

Télécharger des fichiers et lire des blogs est enfantin grâce à Hackety Hack. C'est généralement une seule ligne de Web.download ou Web.fetch.

Une ligne vraiment fantastique est le lecteur de blog:

 #!ruby

 blog = Web.fetch("http://rubyinside.com", :as => Web::Feed)

Cette ligne de code va visiter l'adresse du blog et essayer de trouver sont flux RSS. RSS signifie [Really Simple Syndication]. C'est un fichier que proposent la plupart des blog et qui contient les derniers articles de ce blog.

Une fois récupéré le flux du blog, tu peux parcourir ces entrées:

 #!ruby

 blog.items.each do |item|

   puts "Titre: #{item.title}"

   puts "Liens: #{item.link}"

   puts item.description

 end

Web.download( url: a String , save_as: a String )

Si tu veux suavegarder une fichier w<eb sur ton ordniateur, utilise Web.download avec deux arguments. Le premier est l'URL du fichier sur le web. Le second argument est le nom du fichier sur ton ordinateur.

 #!ruby

 Web.download("http://example.org/songs/Y-Fford-Oren.mp3", "y-fford-oren.mp3")

Web.fetch( url: a String )

Si tu veux récupérer une page web et l'enregistrer dans une variable, utilise Web.fetch.

 #!ruby

 google = Web.fetch("http://google.com/search")

Lorsque Web.fetch rencontre un flux RSS ou XML, tu récupéreras un objet Web::Feed contenant les nouvelles. Si Web.fetch rencontre un fichier JSON, tu récupérera un objet à l'interieur de ce fichier JSON.

La recherhce est un grosse partie du web. Ces deux méthodes, Web.google et Web.yahoo, te permettent d'embarquer les moteurs de recherche directement dans ton programme.

Tu peux même écrire ton propres moteur de recherche personnalisé , afin de chercher uniquement sur certain site. Les méthodes Web.google et Web.yahoo ont toutes deux une clef :site dans laquelle ont peu préciser une liste des sites à utiliser:

 #!ruby

 Web.google( "hackety hack", :site => ["redhanded.hobix.com", "rubyinside.com"])

   #=> [(Web::Feed::Item), (Web::Feed::Item), ...]

Web.google( search: a String )

Effectue une recherche Google. Donne lui une chaîne avec les mots de ta recherche (ou un tableau de mots) et elle te retournera un tableau avec les résultats de ta recherche. Les résultsts sont tous au format Web::Item (exactement comme tu les vois dans le flux des blogs).

 #!ruby

 Web.popup do

   Web.google("hackety hack").each do |item|

     title item.title

     link_to item.link

     para item.description

   end

 end

Cette recherhce propose quelques clefs que tu peux utiliser pour améliorer ta recherche:

  • :exact cherchera les mots dans l'ordre exacte où ils sont présent dans la chaîne.

(Exemple: :exact => true)

  • :limit indique à la recherche combien de résultat elle doit prendre.

(Exemple: :limit => 30)

  • :page prend les 2nd, 3ème, 4ème pages de la recherche, etc.

(Exemple: :page => 2)

  • :site recherche uniquement dans la liste des sites que tu fournis.

(Exemple: :site => ["digg.com", "slashdot.org"])

Web.yahoo( recherche: une chaîne )

Effectue une recherche Yahoo!. Fourni lui une chaîne avec les mots de ta recherche. Tu récupères un tableau de Web::éléments. Tout comme Web.google descrite avant.

 #!ruby

 puts Web.yahoo("hackety hack")

Cette recherche propose quelques clefs que tu peux utiliser pour améliorer ta recherche:

  • :exact cherchera les mots dans l'ordre exacte où ils sont présent dans la chaîne.

(Exemple: :exact => true)

  • :limit indique à la recherche combien de résultat elle doit prendre.

(Exemple: :limit => 30)

  • :page prend les 2nd, 3ème, 4ème pages de la recherche, etc.

(Exemple: :page => 2)

  • :site recherche uniquement dans la liste des sites que tu fournis.

(Exemple: :site => ["digg.com", "slashdot.org"])

Pages

Contruit des pages HTML à partir de zéro.

Web.page { ... }

Puisque Hackety Hack est construit sur les bases d'un navigateur internet, tu peux faire des pages web sur la page de programme masquée. Je dois proposer une façon d'expliquer tout ceci...

 #!ruby

 Web.page {

   h1 'Mes liens'

   ul {

     li { a 'Google', :href => 'http://google.com' }

     li { a 'Hackety Hack', :href => 'http://code.whytheluckystiff.net/hacketyhack/' }  

   }

 }

Web.popup { ... }

Ouvre une fenêtre popup. À l'intérieur du bloc, crée un contenu popup exactement comme c'est expliquer ci-dessus dans Web.page above.

 #!ruby

 Web.popup {

   h1 'Es-tu certain?'

   buttons { Annuler; Enregistrer }

 }

Web.popup( name: a String ) { ... }

C'est une variation de la fenêtre popup précédente. Tu crées toujours un popup à l'intérieur du bloc.

La différence se situe dans la chaîne que tu passes à la méthode. La chaîne sera utilisée pour lier la popup à une table.

 #!ruby

 Web.popup("Blog") do

   titre "Ajouter une entrée"

   editline "Titre"

   editbox

   buttons { Annuler; Enregistrer }

 end

Dans cet exemple, la fenêtre popup conservent ces informations dans la table Blog. Deux choses seront conservées dans la table: les champs d'éditions editline, appelées "Titre" et "Editbox". Si la table n'existe pas , elle sera crée à partir du popup.

Regarde aussi l'aide sur les Tables pour en savoir plus sur l'utilisation des tables.