Variabili "variabili"


#1

Sucsate il gioco di parola ma non saprei come altro definirle (e
quindi non riesco nemmeno a cercare bene su google).

Io avrei necessità di assegnare un valore a una variabile (e fin qui
siamo bravi tutti) solo che il nome di questa variabile è contenuto in
una variabile stringa Es. Var = String.new(“pippo”)
Come posso fare per vaorizzare la variabile “pippo” ???


#2

Io avrei necessità di assegnare un valore a una variabile (e fin qui
siamo bravi tutti) solo che il nome di questa variabile è contenuto in
una variabile stringa Es. Var = String.new(“pippo”)
Come posso fare per vaorizzare la variabile “pippo” ???

Sei sicuro che non ti serviva la eval ?

str = “pippo * 8 / 3”

pippo = 5

totale = eval str

pippo = 33

totale = eval str

alf


#3

è molto picchiato dentto con il martello ma funziona…

my_var_name = “pippo”
my_value_name = ‘“abcd”’

Object.module_eval %{
attr_accessor :#{my_var_name}
}

self.instance_eval “self.#{my_var_name} = #{my_value_name}”

puts pippo

PS: invece di Object si dovrebbe usare la singleton class…

On 5/2/06, Federico G. removed_email_address@domain.invalid wrote:

removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/


#4

Direi che la eval va benissimo per quello che devo fare, purtroppo ne
ignorvo l’esistenza… è ora che mi procuri un ottimo manuale ruby :wink:

P.S. il tuo esempio
my_var_name = “pippo”
my_value_name = ‘“abcd”’
eval “#{my_var_name} = #{my_value_name}”

da errore, o esiste già una variabile che si chiama abcd o nella eval
devo fare qualcosa di simile: eval “#{my_var_name} =
“#{my_value_name}””
o perlomeno questo è il modo grezzo che ho trovato io per farlo
funzionare…

Grazie mille


#5

il tuo esempio a me non funziona. è come se uscito dallo scope della eval
la
variabile andasse persa.

On 5/2/06, Alfonso M. removed_email_address@domain.invalid wrote:

alf_______________________________________________
Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/


#6

P.S. il tuo esempio
my_var_name = “pippo”
my_value_name = ‘“abcd”’
eval “#{my_var_name} = #{my_value_name}”

Avevi probabilmente dimenticato di ‘apiciare’ gli “apicetti” :slight_smile:
(absit iniuria verbis!)

L’eval interno alle stringhe ("… #{espressione} …") è un vero
spasso.

Io uso il Ruby 1.8.2 fornito di serie col Mac OS X (troppo pigro per
upgradare), senza nessuno dei suoi quattro livelli di protezione (che
giocano anzitutto sulle “eval”: cfr. l’esempio del “sito-calcolatore”
nel pragmatic programmer, e l’utente che fa evalutare rm -rf /* o
qualcosa del genere).

~ irb

irb(main):001:0> x = “turz”
=> “turz”

irb(main):002:0> y = ’ “stringa complicata” ’
=> " “stringa complicata” "

irb(main):003:0> eval " #{x} = #{y} "
=> “stringa complicata”

irb(main):004:0> x
=> “turz”

irb(main):005:0> turz
=> “stringa complicata”

alf


#7

è molto picchiato dentto con il martello ma funziona…

Che differenza c’è tra il tuo esempio e questo “senza martello”?

 my_var_name = "pippo"
 my_value_name = '"abcd"'
 eval "#{my_var_name} = #{my_value_name}"

Da parte mia vado matto per la eval:

 a = "def turz ; $$*10 ; end"
 eval a
 puts turz

E ora pure del codice automodificante:

 #!/usr/bin/env ruby

 s="aaa"

 x=open(__FILE__).readlines
 x[2] = "s=#{s.next.inspect}\n"

 open(__FILE__, "w").print(x)
 puts s

alf_______________________________________________
Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


#8

è strano. io gli apicetti li avevo ma continua a non andare

sample.rb:15: undefined local variable or method `pippo’ for
main:Object
(NameError)

sono dovuto ricorrere all’eval cor martello che hai visto prima.

uso 1.8.4

On 5/2/06, Alfonso M. removed_email_address@domain.invalid wrote:

L’eval interno alle stringhe ("… #{espressione} …") è un vero
~ irb
irb(main):004:0> x


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/


#9

ovviamente avevi ragione, mi ero dimenticato di ‘apiciare’ :wink:

Mi sto divertendo come un pazzo adesso che ho conosciuto la eval :smiley:
grazie mille


#10

Io uso la 1.8.4 sotto linux e (una volta ‘apicettato’) mi funziona
correttamente.


#11

forse sono io accecato, non so.

io lancio letteralmente il seguente:

##############################
my_var_name = “pippo”
my_value_name = ‘“abcd”’
eval “#{my_var_name} = #{my_value_name}”

puts pippo
##############################

vi funziona?

On 5/2/06, Federico G. removed_email_address@domain.invalid wrote:

giocano anzitutto sulle “eval”: cfr. l’esempio del “sito-calcolatore”
=> " “stringa complicata” "


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/


#12

##############################
my_var_name = “pippo”
my_value_name = ‘“abcd”’
eval “#{my_var_name} = #{my_value_name}”

puts pippo
##############################

Clamorosamente, qui sul Mac (1.8.2 di Natale 2004) funziona (e scrive
abcd).

alf


#13

Sul mio linux mi lascia dubbioso …
se provo istruzione per istruzione in irb mi funziona che è un piacere
ma se metto le stesse istruzioni (copia & incolla, sbaglio una volta e
poi imparo :smiley: ) in un file eval.rb e provo a eseguirlo con ruby
eval.rb ottengo anche io l’errore
eval.rb:5: undefined local variable or method `pippo’ for main:Object
(NameError)


#14

On 5/2/06, Pilu removed_email_address@domain.invalid wrote:

Io uso ruby 1.8.4 su ubuntu e funziona
ma in irb o mettendolo in un file ?


#15

On 5/2/06, chiaro scuro removed_email_address@domain.invalid wrote:

##############################

vi funziona?

Io uso ruby 1.8.4 su ubuntu e funziona


#16

On 5/2/06, Federico G. removed_email_address@domain.invalid wrote:

Sul mio linux mi lascia dubbioso …
se provo istruzione per istruzione in irb mi funziona che è un piacere
ma se metto le stesse istruzioni (copia & incolla, sbaglio una volta e
poi imparo :smiley: ) in un file eval.rb e provo a eseguirlo con ruby
eval.rb ottengo anche io l’errore
eval.rb:5: undefined local variable or method `pippo’ for main:Object
(NameError)

hai ragione…anche da me fa la stessa cosa…funziona solo in irb


#17

il mistero si infittisce. se invece di

puts pippo

metto

eval “puts pippo”

funziona.

dove cavolo mi mantiene quel contesto?!

On 5/2/06, Pilu removed_email_address@domain.invalid wrote:


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/


#18

se provo istruzione per istruzione in irb mi funziona che è un piacere
ma se metto le stesse istruzioni (copia & incolla, sbaglio una volta e
poi imparo :smiley: ) in un file eval.rb e provo a eseguirlo con ruby
eval.rb ottengo anche io l’errore

Urka, è vero :frowning:
Avevo provato anch’io soltanto con “irb”.

Però se al posto di pippo metto $pippo (globale anziché locale)
funziona anche da ruby anziché irb:

my_var_name = "$pippo"
my_value_name = '"abcd"'
eval "#{my_var_name} = #{my_value_name}"
puts $pippo

Dunque è vero che la variabile pippo nasce e muore all’interno del
contesto della eval.

alf


#19

Pilu wrote:

vi funziona?
Io uso ruby 1.8.4 su ubuntu e funziona

demo.rb:4: undefined local variable or method `pippo’ for main:Object
(NameError)
ruby 1.8.4 (2005-12-24) [i686-linux]

su archlinux


#20

On 5/2/06, Alfonso M. removed_email_address@domain.invalid wrote:

Dunque è vero che la variabile pippo nasce e muore all’interno del
contesto della eval.

eccetto che non muore!

è un incubo, il ritorno delle variabili viventi!

prova eval “puts pippo”