Цикл while в цикле while в ruby
Я относительно новичок в Ruby или вообще в программировании, поэтому, пожалуйста, извините, если я делаю ошибку noob2 с логикой здесь.
Я пытаюсь получить вывод значений пикселей rgba в двоичном для каждого пикселя изображения (и его местоположение), используя Chunky_PNG.
Хотя вывод верен, он отображает только первую строку, похоже, что внешний цикл будет выполняться только один раз.
В этом есть логическая ошибка, или цикл while в цикле while никогда не работает? Я могу представить, что это может быть плохой практикой, но я все же хотел бы знать, почему это не так, как предполагалось.
require 'chunky_png'
image = ChunkyPNG::Image.from_file('test.png')
#vars
$width0 = 0
$widthmax = image.dimension.width.to_i
$height0 = 0
$heightmax = image.dimension.height.to_i
#main
while $height0 < $heightmax do
while $width0 < $widthmax do
puts image[$width0,$height0].to_s(2)[0..7] + " " + image[0,0].to_s(2)[8..15] + " " + image[0,0].to_s(2)[16..23] + " " + $height0.to_s + "," + $width0.to_s
$width0 += 1
end
width0 = 0
$height0 += 1
end
2 ответа
Вам не хватает $
У тебя есть
width0 = 0
Но ты хочешь
$width0 = 0
Это приводит к тому, что $ width0 никогда не обнуляется, поэтому выводится только первая строка. Он считает, что внутренний цикл никогда не должен запускаться снова, так как $width0
все еще на максимальном значении в каждой итерации после первой.
(Вероятно, я должен также добавить, что глобальные переменные - не лучшая идея, как указывали другие, но вы спросили причину, по которой скрипт выводит только первую строку.:))
Ошибка - отсутствующий знак $, как объяснил Рэй Тоал
Еще проще в использовании
each
для петель. Тогда вам не нужно обрабатывать индекс цикла самостоятельно
($height0..$heightmax).each do |height|
($width0..$widthmax).each do |width|
puts image[width,height].to_s(2)[0..7] + " " + image[0,0].to_s(2)[8..15] + " " + image[0,0].to_s(2)[16..23] + " " + height.to_s + "," + width.to_s
end
end