var1 = 123
var2 = "abc"
var3 = nil
%w{ var1 var2 var3 }.each { |nom| puts nom.type }
Ca me donne trois fois "string", ce qui est logique dans le cas présent. Ce que je souhaite avoir c'est "fixnum, string, nil". Mais je ne retrouve pas comment transformer une chaîne en "nom de variable".
# une solution
Posté par castorpilot . Évalué à 2.
Je ne sais pas si ça repond vraiment au probleme, mais voici quand meme :
class Test
attr_accessor :var1, :var2, :var3
def initialize
@var1 = 32
@var2 = "hello"
@var3 = nil
end
end
object = Test.new
%w{ @var1 @var2 @var3 }.each do |name|
puts object.instance_variable_get(name).class
end
$ ruby test.rb
Fixnum
String
NilClass
[^] # Re: une solution
Posté par Kerro . Évalué à 2.
# avec eval ... comme en php
Posté par raj deenoo . Évalué à 1.
var2 = "abc"
var3 = nil
%w{ var1 var2 var3 }.each { |nom| eval("puts #{nom}.class") }
ou
%w{ var1 var2 var3 }.each { |nom| eval("puts #{nom}.type") }
# Plus de précisions
Posté par Kerro . Évalué à 2.
var1 = 123
var2 = 456
var3 = 789
i=0
%w{ var1 var2 var3 }.each { |nom| i=i+nom }
puts i
La méthode avec i = i + eval("puts #{nom}.class") fonctionne. Je recherche cependant quelque chose de plus propre :-) La documentation Ruby étant... étant ce qu'elle est, je n'arrive pas à retrouver l'opérateur ou la classe qui permet d'obtenir la meme chose, mais plus dans les standards Ruby.
# intern
Posté par Kerro . Évalué à 1.
Malheureusement, ça ne fonctionne pas. Je me trompe probablement quelque part. Quelqu'un sait où est mon erreur ?
var1 = "abc"
puts "var1".intern.class
puts "var1".intern
Ca affiche "Symbol" puis "var1" alors que je pensais que ça afficherait "Symbol" puis "abc".
[^] # Re: intern
Posté par Jean B . Évalué à 3.
[^] # Re: intern
Posté par Kerro . Évalué à 2.
Je vais me rabattre sur eval. C'est moche mais ça fonctionne.
# Et pourquoi pas...
Posté par jiyuu . Évalué à 2.
@a, @b, @c = 42, '42', [42]
=> [42,'42',[42]]
%w/a b c/.map {|var| instance_variable_get("@"+var).class }
=> [Fixnum, String, Array]
Mais je ne sais pas si c'est bien conseillé.
[^] # Re: Et pourquoi pas...
Posté par Octabrain . Évalué à 2.
[^] # Re: Et pourquoi pas...
Posté par jiyuu . Évalué à 1.
- variable local (var)
- variable global ($var)
- variable d'instance (@var)
- variable de classe (@@var)
Dans l'exemple au-dessus, j'utilise des variables d'instance qui sont rattachées à l'objet spécial "main" qui correspond au contexte d'exécution du programme. Ça revient au même que l'exemple de castorpilot mais dans son cas, le contexte est explicite (la classe Test).
J'avoue que ma méthode n'est pas très propre. ^^
Sinon, la différence entre variable d'instance et variable local, c'est leur portée.
Un exemple:
self #=> 'main'
@a = 'foo' # variable d'instance de l'objet spécial 'main'
a = 'bar' # variable local
def foo
puts @a
puts a rescue "variable non défini"
end
foo
#=> foo
#=> variable non défini
PS: Je ne suis pas programmeur, je fais du ruby par 'plaisir'. Donc il se peut que ces informations soit imprécises voir carrément fausses. Toutes mes excuses si c'est le cas et toutes corrections et/ou informations supplémentaires sont les bienvenus.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.