Accéder à un attribut via une chaine de caractère

J’ai du mal à formuler la question pour trouver la réponse via Google.

En ActionScript 3, je peux accéder à la propriété d’un objet en écrivant
:

monObject[“nomAttribut”]

Comment puis-je écrire l’équivalent en Ruby s’il vous plaît ?

2009/7/31 Lily :slight_smile: [email protected]:

J’ai du mal à formuler la question pour trouver la réponse via Google.

En ActionScript 3, je peux accéder à la propriété d’un objet en écrivant
:

monObject[“nomAttribut”]

Comment puis-je écrire l’équivalent en Ruby s’il vous plaît ?

si j’ai bien compris : monObject.send(“nomAttribut”)


http://fabien.jakimowicz.com

instance_variable_get(:@nomAttribut)

Et évite d’utiliser du camelCase();

Fabien J. wrote:

si j’ai bien compris : monObject.send(“nomAttribut”)

Oui ! :slight_smile: Ca marche très bien, merci beaucoup !

Fernando P. wrote:

instance_variable_get(:@nomAttribut)

Et évite d’utiliser du camelCase();

Que doit contenir nomAttribut ? Avec une chaîne de caractère contenant
le nom de la propriété, j’obtiens (skill1 = nom de ma variable) :

skill1 is not allowed as an instance variable name

Et sinon, pourquoi tu me déconseilles la case en chameau ?

Lily :slight_smile: a écrit :

Fabien J. wrote:

si j’ai bien compris : monObject.send(“nomAttribut”)

Oui ! :slight_smile: Ca marche très bien, merci beaucoup !

Il ne faut pas oublier de gérer le cas d’un attribut non existant.
Si par exemple tu fais un object.send(:foo) ça va lancer une exception.

Et sinon, pourquoi tu me déconseilles la case en chameau ?

Ça fait trop penser à java.

Note: Vendredi, le troll est permis.


Martin C. || fuse
http://www.noremember.org

Que doit contenir nomAttribut ? Avec une chaîne de caractère contenant
le nom de la propriété, j’obtiens (skill1 = nom de ma variable) :

skill1 is not allowed as an instance variable name
Ha oui, en fait tu voulais accéder à un attribut activerecord, donc il
faut utiliser la solution de Fabien.

Et sinon, pourquoi tu me déconseilles la case en chameau ?
Parce que c’est moche, illisible et pénible à taper :slight_smile:

2009/7/31 Martin C. [email protected]:

Lily :slight_smile: a écrit :

Fabien J. wrote:

si j’ai bien compris : monObject.send(“nomAttribut”)

Oui ! :slight_smile: Ca marche très bien, merci beaucoup !

Il ne faut pas oublier de gérer le cas d’un attribut non existant.
Si par exemple tu fais un object.send(:foo) ça va lancer une exception.

monObject.try(“nomAttribut”) va renvoyer nil si nomAttribut n’existe
pas et la valeur si il existe :wink:


http://fabien.jakimowicz.com
Sent from France

Yop,

Si l’objet hérite d’ActiveRecord, alors il est peut etre plus
interessant d’acceder à ses attributs via les crochets comme en
ActionScript :

my_instance[:my_attribute]

Et donc si tu as une chaine de caractère ça fonctionne aussi :

my_instance[my_attribute]

HTH,


Stéphane Akkaoui

http://imeuble.info

Merci beaucoup les garçons, ça marche ! :wink:
C’est un projet récent donc je suis en 2.3.

Parce que c’est moche, illisible et pénible à taper :slight_smile:

Hmm… on dirait un argument subjectif ça, non ? :stuck_out_tongue:

Ça fait trop penser à java.

Puriste, va !

Je crois savoir que c’est surtout une affaire de goût (et de chauvinisme
?).
Comme la pratique en Ruby encourage plutôt l’usage des underscores,
j’essaie de suivre la mouvance.
En revanche, en ActionScript 3, c’est le camelCase qui est à l’honneur.
Donc je pratique les deux, selon en quoi je code.

Personnellement je trouve que les deux sont bien. Je trouve le camelCase
plus élégant. En revanche quand le nom devient trop long, les
underscores rendent le tout bien plus lisible. Question de goût…

Fabien J. a écrit :

pas et la valeur si il existe :wink:
Exact, c’est bien pratique le try, mais disponible uniquement depuis la
2.3 il me semble.


Martin C. || fuse
http://www.noremember.org

Stéphane Akkaoui wrote:

Yop,

Si l’objet h�rite d’ActiveRecord, alors il est peut etre plus
interessant d’acceder � ses attributs via les crochets comme en
ActionScript :

my_instance[:my_attribute]

Et donc si tu as une chaine de caract�re �a fonctionne aussi :

my_instance[my_attribute]

C’est la première chose que j’ai essayé mais je n’y arrive pas !

Le contenu est nul si j’écris le nom de la variable entre guillemets.
Et j’obtiens ce message si je ne mets pas de guillemet (logique):
undefined local variable or method

Bon, voici les deux lignes :

<%= @skillbar.skill1.name %> # Affiche le nom de skill1

<%= @skillbar[“skill1”].name %> # N’affiche rien

<%= @skillbar[skill1].name %> # Renvoie “undefined local variable or
method”

bonjour :blush:
@skillbar.attributes[“skill1”] ?

Le 31 juillet 2009 15:34, Lily :slight_smile: [email protected] a écrit
:

Lily :slight_smile: a écrit :

Je crois savoir que c’est surtout une affaire de goût (et de chauvinisme
?).
Comme la pratique en Ruby encourage plutôt l’usage des underscores,
j’essaie de suivre la mouvance.
En revanche, en ActionScript 3, c’est le camelCase qui est à l’honneur.
Donc je pratique les deux, selon en quoi je code.

C’est clair qu’il n’y a pas de meilleure casse, mais généralement quand
on plonge dans un nouveau langage c’est mieux d’en suivre les habitudes
; ne serait-ce que pour ceux qui vont maintenir le code.


Martin C. || fuse
http://www.noremember.org

Le 31 juil. 09 à 15:34, Lily :slight_smile: a écrit :

<%= @skillbar.skill1.name %> # Affiche le nom de skill1
<%= @skillbar[“skill1”].name %> # N’affiche rien
<%= @skillbar[skill1].name %> # Renvoie “undefined local variable or
method”

Ok, c’est parce que ton skill1 est une association (has_one ?), non ?
Une association est accessible par une méthode du nom de
l’association, pour toi skill1, et non par un attribut. Alors
effectivement, send est ici nécessaire.


Stéphane Akkaoui

http://imeuble.info

Martin C. wrote:

Lily :slight_smile: a écrit :

Bon, voici les deux lignes :

<%= @skillbar.skill1.name %> # Affiche le nom de skill1

<%= @skillbar[“skill1”].name %> # N’affiche rien

<%= @skillbar[skill1].name %> # Renvoie “undefined local variable or
method”

C’est plutôt skillbar.skill1[name]

skillbar.skill1[name] et @skillbar.skill1[name] ne fonctionne pas chez
moi.

@skillbar est l’objet que je récupère par son id (je suis dans la
page/action “show”)

La classe skillbar prend skill1 comme attribut.
skill1 est un objet. il a pour un attribut “name”.

Je chercher à afficher le “name” de skill1, contenu dans skillbar.

MAIS

J’ai besoin d’appeler dynamiquement skill1 car ça pourrait skill0 ou
skill2.

Peut-être que c’est plus clair avec ces infos.

Mais écrit avec la méthode de Julien ça marche (index = integer):

<%= @skillbar.send(“skill”+index.to_s).name %> et
<%= @skillbar.try(“skill”+index.to_s).name %>

C’est clair qu’il n’y a pas de meilleure casse, mais généralement quand
on plonge dans un nouveau langage c’est mieux d’en suivre les habitudes
; ne serait-ce que pour ceux qui vont maintenir le code.

Je suis d’accord, je fais de mon mieux :slight_smile:

Stéphane Akkaoui wrote:

Le 31 juil. 09 � 15:34, Lily :slight_smile: a �crit :

<%= @skillbar.skill1.name %> # Affiche le nom de skill1
<%= @skillbar[“skill1”].name %> # N’affiche rien
<%= @skillbar[skill1].name %> # Renvoie “undefined local variable or
method”

Ok, c’est parce que ton skill1 est une association (has_one ?), non ?
Une association est accessible par une m�thode du nom de
l’association, pour toi skill1, et non par un attribut. Alors
effectivement, send est ici n�cessaire.

Merci Stéphane.

(il n’y a pas de “edit” sur le forum ??)

Lily :slight_smile: a écrit :

Bon, voici les deux lignes :

<%= @skillbar.skill1.name %> # Affiche le nom de skill1

<%= @skillbar[“skill1”].name %> # N’affiche rien

<%= @skillbar[skill1].name %> # Renvoie “undefined local variable or
method”

C’est plutôt skillbar.skill1[name]


Martin C. || fuse
http://www.noremember.org

On 31 juil, 14:04, Lily :slight_smile: [email protected] wrote:

Et sinon, pourquoi tu me déconseilles la case en chameau ?

En fait, il existe une convention de nommage pour Ruby et pour Rails,
et il est (juste) conseillé d’utiliser des minuscules séparées par des
underscores pour les noms de variables.

Par exemple Ruby se sert de la première lettre pour déterminer le type
de l’élément. Essaie donc de faire commencer ta variable par une
majuscule… :slight_smile:

Un post bien détaillé à ce sujet :
http://itsignals.cascadia.com.au/?p=7


Julien Vignolles

Par exemple Ruby se sert de la premi�re lettre pour d�terminer le type
de l’�l�ment. Essaie donc de faire commencer ta variable par une
majuscule… :slight_smile:

O_o

En même temps, si je faisais commencer mes noms de variables par une
majuscule, vous seriez en droit de me taper ! Parce que dans tous les
langages que je connais (bon ok, même si y’en a pas des listes…), la
convention de nommage fait que les variables commencent par des
minuscules, les noms de classes par des majuscule, les constantes tout
en majuscule, etc.

Alors c’est vrai que malgré ça, en ActionScript, si je déclare une
variable Toto ou une classe titi, ça ne le dérange pas plus que ça…
mais c’est à mon sens plus un défaut qu’une qualité puisque justement ça
incite les noobinous à ne pas respecter ces normes qui sont partagées
par beaucoup de langages.

En tout cas merci pour toutes vos réponses, et promis pas de camelCase
en Ruby :stuck_out_tongue:

Je voudrais embêter personne, mais juste pour vous faire remarquer que
les noms de classe sont en Ruby sont camelCase"isés" :wink:

Sinon, pour ton problème Lily, je dirais “take it the Ruby way” et la
solution de Fabien est la plus élégante : Ruby est un langage objet,
les objets n’ont pas de types et la seule question qui nous importe
quand on veut interagir avec un objet c’est “Peux tu (objet) répondre
à ma question (appel de méthode) ?”. En clair, appeler une méthode sur
un objet revient à lui envoyer un message et en attendre la réponse.
Et pour ton cas, là ou cela devient intéressant c’est quand on
considère qu’en ruby, et les langages objets en général, on ne doit
accéder aux attributs d’une classe qu’au travers d’un accesseur (un
getter quoi…), et le plus drôle c’est que l’usage veut qu’un getter,
qui est une méthode, s’appelle de la même manière que l’attribut qu’il
surcouche : soit pour un attribut @attribut le getter c’est
“attribut” !! Donc quand Fabien te propose sa solution, il te propose
simplement de “demander à l’objet de te retourner le résultat de
l’évaluation d’une méthode qui s’appellerait (conditionnelle car on ne
sait pas l’objet gère cette méthode) comme le nom de l’attribut que tu
souhaites obtenir”. Logique non ?

Bon courage