在ruby中的while循环中的while循环

时间:2013-05-05 19:58:25

标签: ruby loops while-loop chunkypng

我对Ruby或者编程都很新,所以请原谅我,如果我在这里用逻辑做出“noob2错误。”

我正在尝试使用Chunky_PNG为图像中的每个像素(及其位置)获取二进制rgba像素值的输出。

虽然输出是正确的,但它只显示第一行,好像外环只运行一次。

是否存在逻辑错误,或者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 个答案:

答案 0 :(得分:2)

您错过了$

你有

width0 = 0

但你想要

$width0 = 0

这具有从不将$ width0重置为零的效果,因此仅输出第一行。它认为内部循环永远不必再次运行,因为$width0在第一次迭代之后的每次迭代中仍然处于其最大值。

(我可能还应该补充一点,全局变量不是最好的主意,正如其他人指出的那样,但你确实问过为什么脚本只输出第一行。:))

答案 1 :(得分:0)

错误是Ray Toal解释的缺失$符号

使用

更容易
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