[RUBY] Es posible variable distinta dentro de for?

Iniciado por tbgio, 25 Julio 2011, 21:40 PM

0 Miembros y 2 Visitantes están viendo este tema.

tbgio

El asunto no sé como ponerlo mas resumido.

Lo que quiero es que se me genere dentro de un for tantas variables como veces se repita, pero todas las variables distintas, algo así:

for [i]i[/i] 1..5 do
valor[[i]i[/i]] = [i]i[/i] + 1
end


# => valor1 = 2
# => valor2 = 3
# => valor3 = 4
# => valor4 = 5
# => valor5 = 6

¿Es posible?

Novlucker

Nunca he tocado Ruby más allá de un par de veces, pero no es la primera vez que veo ese tipo de pregunta (para muchos lenguajes diferentes), así que ... para que necesitas generar tantas variables y no usas un array/vector?

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

tbgio

porque estoy hacuiendo otro script para extraer archivos, y de la forma que este está hecho, tiene una parte que tiene los nombres de los archivos y otro que tiene los datos. Como no se especifica la distancia a la que está del nombre del archivo si no lo que mide, necesito que cada vez que se lea el nombre del archivo me guarde esta distancia en un variable distinta.

De todas formas, quizás estoy confundiendo variable con array.
Aún así, ¿me podría funcionar el comando push() para eso que quiero hacer?

Novlucker

Me perdí, que distancia? que archivo? :xD

Explicate un poco mejor de que va el archivo que necesitas crear, y que hace el otro que ya tienes :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

tbgio

Tengo un archivo que está construido de la siguiente manera:

0x000 04 bytes: Número de direcciones en la tabla
0x004 04 bytes: Cuanto mide el contenido del archivo = $a
0x008 04 bytes: Cuanto mide el nombre del archivo = $b
0x00c $b bytes: Nombre del archivo

Despues de repetirse desde el 0x004 al 0x00c dependiendo de las direcciones que tenga la tabla, a continuación viene el contenido de cada archivo en el mismo orden en el que han aparecido.

Sabiendo esto, he creado el siguiente codigo:

nombrearchivo = "C:/Program Files/CCP/EVE/resLocalization.stuff"
arch = File.new(nombrearchivo, "rb")
arch_leer = File.new(nombrearchivo, "rb")
dirtotal = arch.sysread(4).unpack('V*').join.to_i
nombrearchivo = "hola/"
# Leo el archivo
cuenta0 = 4
valor5 = []
valor6 = []
for cuenta1 in 1..dirtotal do
valor1 = arch.sysread(4).unpack('V*').join.to_s
valor2 = arch.sysread(4).unpack('V*').join.to_i
cuenta0 = cuenta0 + 8
valor3 = cuenta0
for cuenta2 in 1..valor2 do
cuenta0 = cuenta0 + 1
valor4 = arch.read(1).bytes.first
if valor4 == 92
arch.seek(valor3, IO::SEEK_SET)
content = arch.read(cuenta2)
Dir::mkdir("#{nombrearchivo+content.chop}") unless File.directory?("#{nombrearchivo+content.chop}") == TRUE
end
end
arch_leer.seek(valor3, IO::SEEK_SET)
content = arch_leer.read(valor2)
cuenta0 = cuenta0 + 1
arch.sysread(1)
valor5.push(valor1)
valor6.push(content)
end
sleep 1
for cuenta2 in 0..dirtotal-1 do
puts "guardado #{nombrearchivo+valor6[cuenta2]}"
save_arch = File.open("#{nombrearchivo+valor6[cuenta2]}", File::CREAT | File::WRONLY | File::TRUNC)
save_arch.syswrite("#{valor5[cuenta2]}") unless File.directory?("#{nombrearchivo+valor6[cuenta2]}") == TRUE
end
puts "Fin"


El código no está terminado, pero con la función push() creo haber podido solucionar la duda que tenía.

tbgio

Script modificado. Por cierto, terminado el extractor de archivos *.stuff del juego EVE:nombrearchivo = "C:/Program Files/CCP/EVE/resCharacterModularFemaleHiRes00.stuff"
arch = File.new(nombrearchivo, "rb")
dirtotal = arch.sysread(4).unpack('V*').join.to_i
eve = "EVE/"
Dir::mkdir("#{eve}") unless File.directory?("#{eve}") == TRUE
cuenta0 = 4
valor5 = []
valor6 = []
for cuenta1 in 1..dirtotal do
valor1 = arch.sysread(4).unpack('V*').join.to_i
valor2 = arch.sysread(4).unpack('V*').join.to_i
cuenta0 = cuenta0 + 8
valor3 = cuenta0
for cuenta2 in 1..valor2 do
cuenta0 = cuenta0 + 1
valor4 = arch.read(1).bytes.first
if valor4 == 92
arch.seek(valor3, IO::SEEK_SET)
content = arch.read(cuenta2)
Dir::mkdir("#{eve+content.chop}") unless File.directory?("#{eve+content.chop}") == TRUE
end
valor7 = cuenta0
end
arch.seek(valor3, IO::SEEK_SET)
content = arch.read(valor2)
arch.seek(valor7, IO::SEEK_SET)
cuenta0 = cuenta0 + 1
arch.sysread(1)
valor5.push(valor1)
valor6.push(content)
end
sleep 1
for cuenta1 in 0..dirtotal-1 do
puts "Creado #{eve+valor6[cuenta1]}"

save_arch = File.open("#{eve+valor6[cuenta1]}", File::CREAT | File::WRONLY | File::TRUNC)
save_arch.syswrite("#{arch.read(valor5[cuenta1])}") unless File.directory?("#{eve+valor6[cuenta1]}") == TRUE
end
puts "Fin"

Novlucker

Justamente me refería a utilizar un array ([]) para ir metiendo cada uno de esos valores que ibas leyendo, donde cada item del array es un elemento.

Por otra parte, te sugiero comenzar a utilizar variables que resulten más representativas, porque así como esta se hace bastante "feo" leer el código :xD

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

tbgio

Ya ya jajaja, gracias, y así lo hago, pongo cosas mas lógicas que no valorX, pero este lo hice muy rápido porque me urgía sacarlos archivos.