j'ai une tite observation a partager, je sais qlqs notions de bases sur la POO en générale, j'ai cru que dans ttes les languages de POO les attribus de class doivent étre toujours privés par contre la sont publics avec la declaration "attr_accessor" et on peut les manipuler sans conditions !! bon je voulais juste me clarifier a propos de ce point et est ce qu'il y a un moyen de les rendres privés, apart ça j'ai hate de finir ce superbe cour :)
Salut @YounesW1nt3r : En POO, les attributs ne doivent pas être privés (sauf dans certains langages ou dans les mauvais cours qui sont malheureusement très courant.
Sinon pour répondre à ta question, les attributs sont privés par défaut en Ruby, donc pour les mettre en privé tu n'as rien à faire, il te suffit de ne pas utiliser de méthode (et pas déclarations) comme attr_accessor. En fait, la méthode attr_accessor ne rend pas l'attribut x public mais crée deux méthodes x et x= qui permettent d'accéder à xet de le modifier. Sinon les bonnes pratiques de Ruby veulent qu'on donne aux méthodes la visibilité nécessaire (avec public, private et protected) et qu'on utilise les méthodes types attr quand on en a besoin. Par exemple, si on n'as pas à modifier l'attribut, utiliser attr_reader et pas attr_accessor.
PS : finalement ce que tu veux faire c'est peut-être mettre un accesseur en privé. Tu peux le faire avec private, mais dans ce cas as-tu vraiment besoin d'un accesseur ?
alors j'ai réussi à afficher le nombres d'amis avec ce code qui est fonctionnel
le soucis c'est que pour la suite du TP où on doit vérifier qui est ami avec qui, ça ne fonctionne pas, je pense que c'est du prénom des amis insérés dans un tableau mais j'aimerais juste comprendre pourquoi ?
Après vérification dans le tutoriel, le code proposé ne marche pas (dans le cas où les deux personnes ne sont pas amies, il ne renvoie pas false). Je l’avais déjà fait remarquer, mais bon... Voici un code.
class User
attr_reader :name
attr_accessor :friends
def initialize(name, friends = [])
@name = name
@friends = friends
end
def friend_with?(other)
friends.include?(other)
end
end
alice = User.new('Alice')
bob = User.new('Bob')
jane = User.new('Jane')
alice.friends = [bob, jane]
puts alice.friends.size
puts alice.friend_with?(bob)
Il y a quelquechose que je ne comprends pas pour le TP de la première partie du cours Ruby, en l’occurrence le deuxième défi.
J'ai ce code :
voyages = [
{ ville: "Paris", duree: 10 },
{ ville: "New York", duree: 5 },
{ ville: "Berlin", duree: 2 },
{ ville: "Montréal", duree: 15 }
]
puts "DEFI N° 2 - Mes vacances de rêve"
voyages.each do |voyage|
puts "Voyage à " + voyage[:ville] + " pour " + voyage[:duree] + " jours"
end
qui me renvoie cette erreur :
DEFI N° 2 - Mes vacances de rêve
voyages.rb:11:in `+': no implicit conversion of Fixnum into String (TypeError)
from voyages.rb:11:in `block in <main>'
from voyages.rb:10:in `each'
from voyages.rb:10:in `<main>'
Alors que si je fais ça :
voyages = [
{ ville: "Paris", duree: 10 },
{ ville: "New York", duree: 5 },
{ ville: "Berlin", duree: 2 },
{ ville: "Montréal", duree: 15 }
]
puts "DEFI N° 2 - Mes vacances de rêve"
voyages.each do |voyage|
puts "Voyage à #{voyage[:ville]} pour #{voyage[:duree]} jours"
end
ou même ça (en ne concaténant qu'une seule chose) :
voyages = [
{ ville: "Paris", duree: 10 },
{ ville: "New York", duree: 5 },
{ ville: "Berlin", duree: 2 },
{ ville: "Montréal", duree: 15 }
]
puts "DEFI N° 2 - Mes vacances de rêve"
voyages.each do |voyage|
puts "Voyage à " + voyage[:ville]
end
ça passe.
Je peux faire en sorte que cela fonctionne mais j'ai besoin de comprendre pourquoi cela fait cette erreur pour avancer.
Merci par avance.
"Striker : Surely you can't be serious. Rumack : I am serious... and don't call me Shirley."
C’est normal, quand tu écris puts str + 22, il va essayer d’afficher str + 22, et donc d’additionner une chaîne de caractère et un nombre, opération non licite car, comme le dit l’erreur, pas de conversion implicite de Fixnum vers String. Tu dois donc la faire explicitement en utilisant la méthode to_s.
puts "Voyage à " + voyage[:ville] + " pour " + voyage[:duree].to_s + " jours"
Si cela fonctionnait avec voyage[:ville] seul, c’est que l’utilisation de l’opérateur + avec deux chaînes est licite (c’est la concaténation). À noter que l’interpolation est à privilégier. Si elle fonctionne dans ton exemple, c’est tout simplement que la méthode to_s va être automatiquement appelée quand tu écris #{voyage[:duree]}.
À noter qu’on pourrait redéfinir + pour qu’il fonctionne avec les entiers et tout ce qui possède une méthode to_s.
class String
def +(other)
"#{self}#{other}"
end
end
print "Bonjour " + 22
Donc si j'ai bien compris, c'est parce que voyage[:duree] a pour valeur un nombre et que du coup on ne peut pas concaténer une chaîne de caractère avec un nombre que cela génère une erreur c'est bien cela ? Et avec la méthode .to_s cela règle problème c'est ça ?
Je pense aussi que si cela a fonctionné aussi avec voyage[:ville] c'est parce qu'on concatène deux chaines de caractères aussi non ?
"Striker : Surely you can't be serious. Rumack : I am serious... and don't call me Shirley."
> Donc si j'ai bien compris, c'est parce que voyage[:duree] a pour valeur un nombre et que du coup on ne peut pas concaténer une chaîne de caractère avec un nombre que cela génère une erreur c'est bien cela ? Et avec la méthode .to_s cela règle problème c'est ça ?
Oui c’est ça. Mais comme je l’ai dit, l’interpolation de variables est la solution à privilégier.
> Je pense aussi que si cela a fonctionné aussi avec voyage[:ville] c'est parce qu'on concatène deux chaines de caractères aussi non ?
Ouep, c’est ce qui est écrit dans la suite de mon message, l’utilisation de + avec deux chaînes de caractères est licite, c’est la concaténation.
J'aimerais comprendre comment est-ce que l'on peut afficher quelquechose dans le condition de la méthode suivante dans la mesure où on ne met pas de puts ? Est-ce facultatif (il ne me semble pas) ?
def aime_le(langage)
if langage == langage_prefere
"Oui :)"
else
"Non :("
end
end
"Striker : Surely you can't be serious. Rumack : I am serious... and don't call me Shirley."
C’est tout simplement que cette méthode n’affiche rien du tout, elle renvoie juste une chaîne de caractère (que tu pourras ensuite afficher). C’est le return qui est facultatif. Pour t’en convaincre, essaie ces deux codes.
def f
"Bonjour"
end
f
def f
"Bonjour"
end
puts f
Le premier code n’affiche rien du tout (si tu es dans l’interpréteur, tu verras quand même « bonjour » car l’interpréteur te donne la valeur retournée par la fonction) contrairement au deuxième où on utilise puts pour afficher la valeur retournée par f, c’est-à-dire « Bonjour ».
j'ai un probleme sur le Terminal Mac + Sublime text pour le TP 1. Lorsque je souhaite faire tourner mon code sur le terminale il m'affiche
desktop/RUBY/boucles.rb: line 1: voyages: command not found
desktop/RUBY/boucles.rb: line 12: syntax error: unexpected end of file
c'est pour le sujet 3 du TP 1 :
voyages = [
{ ville: "Paris", duree: 10 },
{ ville: "New York", duree: 5 },
{ ville: "Berlin", duree: 2 },
{ ville: "Montreal", duree: 15 }
]
voyages.each do |voyage|
if voyage[:duree] <= 5
puts "Voyage à #{voyage[:ville]} de #{voyage[:duree]} jours"
end
end
Le code fonctionne parfaitement quand je le tape directement dans le terminale mais lorsque j'utlise sublime text et que je compile sur le terminale cela m'affiche les erreurs que j'ai expliqué plus haut.Cela fonctioné tres bien hier pourtant...
Je viens de commencer le mooc Ruby. Il y a un point que je ne comprends pas...Dans cette partie du code (TP manipulez une instance de classe)
je ne comprends pas que l'on doive ajouter l'extension .nom à ami ...Pour moi la variable s'appelle ami pas ami.nom. Quelqu'un pourrait m'expliquer comment s'associe ces deux valeurs ?
Ce que je comprends, c est que on doit tester toutes les valeurs de amis / donc on fait une boucle pour comparer tout ce qui se trouve dans amis et on met les valeurs dans la variable "ami". Pas ami.nom...
Oui, la variable s’appelle ami, mais le paramètre que prend notre fonction est un nom, on teste donc si l’ami a le même nom que celui passé en paramètre. Mais de toutes les manières, c’est mal foutu.
Avec ça, il te suffit d’être ami avec un Henry pour être ami avec tous les Henry qui existent. Ce serait plus simple de passer un objet du même type qu’ami a la fonction et de regarder s’il s’agit de cet ami.
Pourquoi cette fonction s’occupe de faire de l’affichage ?
Autant utiliser les méthodes faites pour comme include?.
Donc finalement, ce code s’écrirait plutôt comme ça.
def is_friend_with?(p)
friends.include?(p)
end
On regarde juste si p est présent dans le tableau friends.
Bonjour , je suis actuellement en train de programmer un logiciel en ruby qui permettrait de poster un commentaire en boucle sur plusieurs vidéos pour faire la promotion d'un site ou autre .
J'ai donc commencer par ceci :
Bonjour , je suis actuellement en train de programmer un logiciel en ruby qui permettrait de poster un commentaire en boucle sur plusieurs vidéos pour faire la promotion d'un site ou autre .
J'ai donc commencer par ceci :
require 'uri' require 'watir' puts "***************************************************" puts "* Bienvenu dans Spam-tools *" puts "* Créer par fatestone *" puts "*[*]Spam des commentaire sur des viéos youtube *" puts "***************************************************" puts "Quelle titre de vidéo à rechercher ?" mot_a_rechercher = gets puts "Quelle commentaire spam ?" commentaire = gets puts "Le commentaire est donc: #{commentaire} Et le mot à recherche est #{mot_a_rechercher}" loop do @browser = Watir::Browser.new::chrome @browser.goto "https://www.youtube.com" end
La il n'est que sensait ouvrir un page chrome et aller sur youtube mais Ruby me décline une erreur :
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/common/service.rb:57:in 'binary_patch' : Unable to find chromedriver. Please download the server and place it somewhere on you PATH .
Mais le probleme c'est que avec firefox ca me fait la meme chose et je ne sais pas du tout ou est le dossier PATH et ou télécharger le server ...
Merci
La il n'est que sensait ouvrir un page chrome et aller sur youtube mais Ruby me décline une erreur :
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/common/service.rb:57:in 'binary_patch' : Unable to find chromedriver. Please download the server and place it somewhere on you PATH .
Mais le probleme c'est que avec firefox ca me fait la meme chose et je ne sais pas du tout ou est le dossier PATH et ou télécharger le server ...
Merci
- Edité par DavidSyllas 12 janvier 2018 à 17:28:22
Poste ton code avec les balises de code (le bouton > de l’éditeur). Comme ça, on pourra le copier et l’essayer pour trouver plus facilement le problème. Sinon, quelques remarques.
On ne devrait pas pouvoir modifier la couleur, la marque et le modèle de ta voiture (donc pas de attr_accessor).
Dans ton each, ta variable devrait être une voiture et pas marque, model, couleur. C’est ce qui cause ton erreur. Ta variable devrait être une voiture voiture que tu utiliserais ensuite dans le puts avec voiture.marque, etc.
Pourquoi ne pas utilise la méthode afficher de la classe Voiture dans ton each ou mieux, définir une méthode to_s.
class Car
attr_reader :make, :model, :color
def initialize(make, model, color)
@make = make
@model = model
@color = color
end
def to_s
"#{@make} #{@model} #{@color}"
end
end
parking = []
parking << Car.new("Toyota", "Camry", "rouge")
parking << Car.new("Citroën", "C4", "verte")
parking << Car.new("Mercedes", "Class A", "blanche")
parking.each { |car| puts car } # Plus simplement, puts parking
J'ai des problèmes avec ce passage : "placer votre console dans le dossier qui contient votre fichier boucles.rb (pour cela tapez cd nom_du_dossier dans votre console)"
Dès que j'insère cd C:\Users\Utilisateur\Documents\Web\Ruby\cours j'ai un SyntaxError je n'arrive pas à travailler avec mon document rb et la console.
Où est-ce que je me suis trompée ?
Ps. Merci pour le cours ! J'adore !
Bonjour !
Il me faudrait plus d'informations pour t'aider. Est-ce que tu arrives à te rendre dans le dossier et c'est au moment de l'exécution que ça échoue ? Ou bien est-ce que c'est le "cd" en lui même qui ne fonctionne pas ?
Merci
Non c'est justement ça le problème, je n'arrive pas du tout à rentrer dans mon dossier et oui c'est au moment de l’exécution que ça échoue ..
En gros, c'est ça Mais surement j'ai loupé quelques passages ... je ne suis pas pratique des consoles
Merci !!!!!
Trouvé : avec PowerShell (Windows) ça marche. Je me suis trompée de console, c'est tout !
Merci !!
Bonjour,
Je commence le cours d'initialisation sur Ruby. J'ai installé la dernière version de Ruby 2.5.0-2-x64 sur Windows 10. Tout comme Lythande, j'ai eu du mal à ouvrir la console dans le dossier où se situer mon fichier "boucles.rb" !
Plus exactement à ce stade :
Jusqu'ici, on a exécuté des commandes Ruby directement dans la console à l'aide de l'IRB. À présent, nous allons écrire des commandes Ruby dans un fichier à part, puis exécuter ce fichier dans la console. Je vous propose donc de :
créer un fichier vide boucles.rb ;
l'ouvrir dans votre éditeur de texte à côté de votre console ;
placer votre console dans le dossier qui contient votre fichier boucles.rb (pour cela tapez cd nom_du_dossier dans votre console).
Lythande m'a mis sur la voie. Avec la dernière version de Ruby 2.5.0-2-x64 on a 2 consoles ! l'une Interactive Ruby et l'autre StartCommand Prompt with Ruby ! Pour ma part j'ai utilisé la 2ème : Start Command Prompt With Ruby et ça marche ! En outre j'ai aussi utilisé Windows Power Shell (ne marche pas !!!) et Windows Power Shell (x86) (qui MARCHE !!!) En espérant débloquer certains néophytes qui sont bloqués à ce niveau là du cours ! Cordialement.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
"Striker : Surely you can't be serious. Rumack : I am serious... and don't call me Shirley."
"Striker : Surely you can't be serious. Rumack : I am serious... and don't call me Shirley."
"Striker : Surely you can't be serious. Rumack : I am serious... and don't call me Shirley."
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.