Fast Ruby n°1

11 Réponses • 1686 Vues

Nuri Yuri

HostMaster

Salut, je vais vous faire une suite de petits tutoriels permettant de se lancer doucement dans le Ruby. Le but des tutos Fast Ruby ne sera pas forcément de voir le Ruby en détails mais surtout d'aborder les notions utiles au Scripting sous RPG Maker ou simplement avec des applications Ruby. Vous pourrez poser des questions pour des explications plus détaillés si besoins. Le nom de cette suite de tutoriel veut dire que les tutoriels seront rédigés sur le tas d'où une qualité pas forcément au rendez vous mais vous êtes libres de remanier à condition d'indiquer que vous avez remanié un des tutoriels Fast Ruby.

Si ce tutoriel parait un peu compliqué, vous pouvez faire un petit tours rapide sur https://www.ruby-lang.org/fr/documentation/quickstart/ avant de commencer à vous plonger dans les tutoriels Fast Ruby.

Fast Ruby n°1 - Les variables

Nous allons commencer par les variables, sans les variables je peux pas trop parler du reste car les variables stockent quasiment l'intégralité du programme que vous réalisez.

Déjà, une variable qu'est-ce que c'est ?
Une variable c'est un élément du programme qui est désignée par un nom et qui contient une valeur. (Définition simplifiée)
En Ruby les variables contiennent des objets et comme tout est objet en Ruby, les variables ne sont pas explicitement typés.

J'ai parlé d'objet, en effet Ruby est un langage de programmation orientée objet, passez sur ce sujet pour quelques détails à ce niveau : http://communityscriptproject.com/forum/index.php?topic=160.0

Les objets basiques

Avant de parler en détails des variable je vais vous donner les différents objets basiques qui vont nous aider à parler des variables.
Les objets basiques nécessaire ici sont les nombres 1, 2, 3...
Les booléens true, false
Les chaines de caractère : 'Salut !', "Coucou."

Les variables en détail

En Ruby, il existe différent type de variable, elles n'ont pas toute la même fonction, la même portée et non plus le même comportement, ce pourquoi je vais toute les lister et vous expliquer leur particularité. Le but est bien entendu que vous utilisiez les bonne variables dans vos script et que vous compreniez l'utilité de chacune d'elle.

Les variables locales
Les variables locales sont le type le plus primitif de variable en Ruby, elle servent à réaliser des opérations localement,
Supplément
comme elles sont locales, l'accès à celle-ci est plus rapide car Ruby ne cherche pas les variable à partir de leur nom au moment de l'exécution du programme mais sait déjà où la variable est censé se trouver lors de l'exécution. Si vous avez beaucoup de traitement à réaliser dans une fonction, utilisez les, ça ne fera pas de mal à votre programme.
On utilise principalement les variables locales dans les méthodes car c'est là que leur intérêt se fonde.

Les variables locales s'écrivent avec tous les caractères qui ne servent pas d'identificateur à Ruby, elles peuvent donc commencer tous les caractères que vous pouvez écrire sur votre clavier hormis les majuscules, le $, le signe arobase (@) et les signes servant à la syntaxe. Une fois le premier caractère écrit vous pouvez mettre les caractères que vous voulez hormis les éléments de syntaxe le $ et le @.

Exemple :
[bgcolor=#000000]ma_variable1 = 5
mon_texte = "Hello World."
[/bgcolor]

Les variable locales comme leur nom l'indique sont de portée locale, cela veut dire que vous ne pouvez pas y accéder en dehors de là où elles sont définie au moment où Ruby exécute le code. Un exemple simple, dans IRB ou Yuki Eval, si vous tapez ma_variable = 5 et que vous appuyez sur entrée. ma_variable vaudra 5 au moment où Ruby exécute la commande. Sauf que après cela Ruby ne se trouve plus où ma_variable a été défini donc ma_variable n'existe plus et si vous tapez ma_variable après l'exécution du morceau de code précédent Ruby va vous dire un truc du genre :
[bgcolor=#000000]undefined local variable or method `ma_variable' for main:Object[/bgcolor]
Par ailleurs, si un morceau de code est exécuté plusieurs fois en dehors d'une boucle standard et d'un bloc (une méthode) la portée des variables locale de ce morceau de code est le niveau de l'exécution du morceau de code donc la variable locale qui porte le même nom peut "contenir" plusieurs valeurs car en réalité c'est pas la même variable pour Ruby car c'est pas le même niveau d'exécution donc à chaque niveau la variable aura ses propres valeurs et cela ne sera pas affecté par les autres niveaux. (En dehors des blocs.) C'est compliqué d'être clair pour ceci, vous comprendrez en vous exerçant. (Notez juste que c'est la raison pour laquelle les variables locales se nomment variable locales.)

Les variables globales
Avant d'entrer dans le variables utiles à la programmation orientée objet, parlons des variables globales. Si vous avez déjà un peu regardé les scripts d'RPG Maker vous avez certainement vu certaines d'entre elles. Aller, elles commencent toute par un "$". Le but des variables globale est de fournir un accès global à un objet qui généralement sert au traitement de données de votre programme. Ces n'ont pas la nécessité d'être initialisés donc vous pouvez récupérer le contenu d'une variable globale même si elle n'est pas initialisé, Ruby vous donnera nil.

Dans RMXP nous avons $game_player qui vous permet de réaliser des actions sur le héros. Dans PSP et Pokémon SDK, vous avez $pokemon_party qui vous permet de réaliser certaines actions sur les données relative aux données Pokémon.

Il ne faut pas abuser des variables globales, mais il faut aussi savoir s'en servir pour rendre votre programme le plus simple à utiliser à condition de bien maîtriser la chose. Plus vous aurez de variables globales, plus l'accès à celle-ci sera lent alors choisissez bien vos variables globales.

Les Constantes
Ne vous méprenez pas, leur nom est un énorme mensonge, du moins, cela dépends du niveau de sécurité imposé à Ruby. Les constantes sont des variables au même titre que d'autres variables, leur utilisation est juste différente :
Elles servent principalement à définir des modules et des classes, elles commencent par une Majuscule, toujours, après vous mettez ce que vous voulez tant que c'est pas un élément de syntaxe Ruby vous embêtera pas trop.

Normalement les constantes ne peuvent pas changer de valeur mais Ruby se contente juste de vous signaler que vous n'avez pas le droit de modifier la variable, un peu comme la justice qui signale à un Ministre qu'il a pas le droit de mentir sur ses finance. De ce fait, on utilise les constante comme on utilise les variable préprocesseur dans d'autres langage, ça nous permet de mieux maintenir le programme en permettant des modifications plus efficaces et de rendre la chose un peu plus rapide à condition de bien gérer les constantes.

La porté des constantes est la classe / le module où elles ont été définies mais les constante ne possèdent pas d'encapsulation. Les constantes peuvent être hérités mais la modification n'impacte la constante du parent. (Si une constante n'existe pas dans une classe enfant, Ruby va chercher dans les classes parente, ce qui explique cet "héritage").

Vous pouvez par exemple utiliser les constante pour définir le nom d'un fichier et récupérer ce nom là où c'est nécessaire, une modification de la constante en question vous permettra de bel et bien modifier partout avec le nouveau nom de fichier plutôt que de chercher toutes les lignes qui contenaient le nom de fichier pour le changer. C'est un réel gain de temps, pensez-s-y mais comme les globales, n'en abusez pas.

Les variables d'instance
On entre dans la programmation orienté objet.

Les variables d'instance comme leur nom l'indique sont valables que dans l'instance (objet) où elles ont été définies et ne sont pas accessible ailleurs sauf si vous définissez des getters et/ou setters (attributs en Ruby : rb_define_attr). Le but de ces variables est clairement de stocker une caractéristique de l'objet en lui même pour son fonctionnement (caractéristique étant un autre objet) avec le respect de l'encapsulation.

Les variables d'instance en Ruby commencent par un seul @ et valent nil par défauts. Après, il faut faire gaffe car les classes étant elles aussi des objets, elles ont donc elles aussi des variables d'instance alors je vais vous écrire un code avec deux fonds différents, le fond rouge indique que toute variable définie ou appelés à cet endroit sont celles de la classe, le fond bleu indique que toute variables d'instance définie ou appelés à cet endroit sont celles des objets de la classe.
[bgcolor=#000000]class Classe[/bgcolor]
[bgcolor=#600000] @variable_dinstance_de_Classe = 4
#blablabla

[/bgcolor]
[bgcolor=#000060] def methode_des_objet_de_classe
  @variable_dinstance_des_objets_de_classe = 5
[/bgcolor]
[bgcolor=#000000] end

[/bgcolor]
[bgcolor=#600000] def self.methode_appartenant_a_lobjet_Class
  print @variable_dinstance_de_Classe
[/bgcolor]
[bgcolor=#000000] end
end
[/bgcolor]
[bgcolor=#000000][/bgcolor]

Les variables de classe
Les variables de classe sont un cas un peu particulier. C'est comme des globales avec de l'encapsulation et ça se comporte quasiment comme des constantes. C'est une chose très bizarre mais qui peut être utile si vous avez besoins de communiquer entre les classes enfante et la classe ou les objets étant de ces classes.

Une variable de classe commence par deux @ et doit impérativement avoir été initialisé au même niveau que les constantes pour être valable. Vous ne pouvez pas accéder aux variables de classe depuis les parents ou objets des classes parentes de la classe dans laquelle cette variable et il est d'ailleurs impossible de créer un accès à cette variable d'instance sans écrire une fonction permettant ceci.

Les variables de classe se manipulent avec précaution donc n'utilisez pas activement si vous n'avez pas un tout petit peu d'expérience.

Voilà pour les variables, finalement ça a été plus long à écrire, si vous avez besoins de plus d'informations ou si vous pensez que des corrections sont nécessaires, dites le moi, on en discuteras. La prochaine fois je vais parler des classes et modules en tant que conteneur de constantes, c'est une chose assez intéressante et j'ai l'impression que c'est un peu mis à l'écart.

« Modifié: 24 février 2015, 17:11:40 par Nuri Yuri »

ln(yo) = <3

Tuto Script

Youspin

Programmeur

Super tuto mais tout ça reste pour moi du chinois :'(
Sympa et super simple, à la portée du premier venu
J'comptait aussi faire un tuto mais vu que t'en prévoi une série :3

Bref, GG à toi !
C'est bien d'avoir ce genre de contenu sur le forum. Bonne initiative, Yuri !

SirMalo

Graphiste

Très bonne initiative en effet ! En revanche, je pense qu'il faut quand même un minimum de notions avant d'entamer ton tuto, et c'est pourquoi je ne l'ai pas lu en entier. Si tu comptes faire des tutoriels accessibles à tout le monde, essaie de faire encore plus simple ou, si ce n'est pas possible, d'expliquer plus de notions.

Je m'y attarderai sûrement plus longuement car ça m'intéresse ;)
Merci pour ce premier (d'une longue série, j'aurai au moins besoin de ca pour y voir clair ^^) post sur ruby !

Pensant que la pratique reste le meilleur moyen d'apprendre, et après avoir lu 2x ce post. J'aurai une/deux question par rapport à un petit soucis que j'ai rencontré il y a peu.
Je vais essayer d’être le plus clair possible.

Sur psp, je créer un événement, en insérant le script : draw_choice_plus(["choix1","choix7"],6)
Ensuite je place mes 7 conditions avec : draw_choice_plus == x
Je test et sa plante, jusqu’à ce que je rajoute $ pour donner ceci : $draw_choice_plus == x

- Est ce une variable globale ?
- Ensuite je me demande pourquoi j'ai besoin du $ dans mes conditions et pas dans l'insertion du script à l’évènement ?


*Si des fois il n'y aucun rapport avec le sujet, excusez moi, c'est la faute du "$" qui m'aurai induit en erreur.


 
 
Merci pour ce premier (d'une longue série, j'aurai au moins besoin de ca pour y voir clair ^^) post sur ruby !

Pensant que la pratique reste le meilleur moyen d'apprendre, et après avoir lu 2x ce post. J'aurai une/deux question par rapport à un petit soucis que j'ai rencontré il y a peu.
Je vais essayer d’être le plus clair possible.

Sur psp, je créer un événement, en insérant le script : draw_choice_plus(["choix1","choix7"],6)
Ensuite je place mes 7 conditions avec : draw_choice_plus == x
Je test et sa plante, jusqu’à ce que je rajoute $ pour donner ceci : $draw_choice_plus == x

- Est ce une variable globale ?
- Ensuite je me demande pourquoi j'ai besoin du $ dans mes conditions et pas dans l'insertion du script à l’évènement ?


*Si des fois il n'y aucun rapport avec le sujet, excusez moi, c'est la faute du "$" qui m'aurai induit en erreur.

Ta variable contient un $ donc c'une variable globale (Qui peut-être utilisée partout)
Lors de l'insertion du script à l'évènement, tu n'appelle PAS la variable draw_choice_plus mais la méthode, tu ne dois donc pas mettre $, mais lors de ta condition, tu as besoin d'une variable, donc, du $
la méthode et la variable ont juste le même nom, la méthode pourrait s'appeller "super_question_de_la_mort_qui_tue", tu devra toujours utiliser la variable globale $draw_choice_plus pour le résultat
J'ai pas PSP sous la main, mais de ce dont je me souviens:

  • draw_choice_plus() est bel est bien une méthode, donc tu l'as correctement utilisé
  • Elle renvoie la valeur du choix dans la variable globale $draw_choice_plus

Ce qui explique que ta condition teste une variable globale. Plus généralement, il est impossible de tester une fonction comme ça. L'autre syntaxe n'avait aucun sens - à moins d'avoir une variable locale, qui n'aurait alors pas servi à grand chose dans ton cas.

Nuri Yuri

HostMaster

Faudra que je parle de ça dans la partie sur les fonctions.

@SirMalo : J'essaierais de faire plus compréhensible, mais c'est assez compliqué. J'écris des pavés dans le tutoriel pour détailler les choses au mieux ce qui permettrait de repasser par dessus dans le cas où un petit morceau n'est pas compris.

C'était peut être maladroit de commencer par les variables. Je vais mettre un lien vers Apprendre Ruby en 20 minutes pour que les gens puissent avoir un peu de notion avant de lire mes pavés.
ln(yo) = <3
Je ne pense pas que commencer par les variables soit une mauvaise chose ... ou alors que ne vois pas ce qu'il faudrait présenter avant si ce n'est l'IDE (qui dans ce cas est RMXP) ou alors la distinction ruby/RGSS.

Les variables sont vraiment la base de n'importe quel langage donc je trouve ça logique d'en parler dès le début, maintenant, je ne dis pas que c'est facile pour tout le monde, mais avec un peu de motivation tout est possible :)

Quoi qu'il en soit, c'est une très bonne idée de faire des tutos là dessus donc continue :) !

Don

Musicien

Après tant d'années où je te vois maîtriser le Ruby, j'attendais vraiment un tuto de ta part, gros GG !
Merci ça va m'aider :oui: (même si ça a l'air assez compliqué)

There was an error while thanking
Thanking...