Цикл 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
Другие вопросы по тегам