case文

case文でちょっとあれ?っと思ったことがあるのでまとめ

tags = [ "A","IMG","PRE" ]
tags.each do |tagname|
 case tagname
 when "P","A","I","B","BLOCKQUTE"
  print tagname, " has child.\n"
 when "IMG","BR"
  print tagname, " has no child.\n"
 else
  print tagname, " cannot be used.\n"
 end
end

これの出力結果は

A has child.
IMG has no child.
PRE cannot be used.

となるんですけど、ちょっと疑問に思ったことが。

eachメソッドは配列の大きさだけ実行されるからこの場合は3回実行される。

そこで、その一回の実行ごとに2回比較があるのかなーっとふと思いました。

まぁ、ちゃんと考えたらあたりまえのことなんですが・・・

配列を

tags = [ "IMG","PRE","A" ]

と変えたら、1回の実行ごとに2回の比較が行われていないなら、
なにも出力されないんじゃないかな?
っと思って、変えて実行してみましたけど、ちゃんと出力されましたね。

結果は

IMG has no child.
PRE cannot be used.
A has child.

となりました。

配列の順番が違うので、tagnameに代入される順番が変わってくるので
出力される順番も変わりますね。

ちょっと、あれ?って思ったので、当たり前のことですが、まとめです。


なお、このコードは
著者「高橋征義+後藤裕造」の「たのしいRuby第3版」から
引用させていただきました。