「たのしいRuby」条件判断if、unless、case、when

Rubyの本、買ってきた。「たのしいRuby」勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。「たのしいRuby」の続き、条件判断
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon
## 参考文献
この記事は以下の情報を参考にして執筆しました。
-[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)
-[『たのしいRuby 第6版』サポートページ、ソースコード](https://tanoshiiruby.github.io/6/index.html)


### if文（if式？）

ifはごく標準的。if勉強定番の「世界のナベアツ」を書いてみよう。
「世界のナベアツ」のオリジナルの映像が見つからないので再現CGのリンクを載せておく。
YouTube https://www.youtube.com/watch?v=ntWfk25G7Vg

~~~Ruby:sekaino_nabe_atsu.rb　独自
def sekaino_nabe_atsu
    # 数字nに3があるか3の倍数の時、世界のナベアツは”あほ〜”になる
    for n in 1..40 do # 1から40までの数n
        tens_place = n / 10 #10の桁、nを10で割った商
        ones_place = n % 10 #1の桁、nを10で割った余り
        remainder_divided_by_three = n % 3 #nを3で割った余り
        
        if tens_place==3 || ones_place==3 || remainder_divided_by_three==0
            print tens_place, ones_place, " あほ〜\n"
        else
            print tens_place, ones_place, " きりっ\n"
        end
    end
end

sekaino_nabe_atsu
~~~
~~~coomand_line:coomand_line
➜  ~ ruby sekaino_nabe_atsu.rb
01 きりっ
02 きりっ
03 あほ〜
04 きりっ
05 きりっ
06 あほ〜
07 きりっ
08 きりっ
09 あほ〜
10 きりっ
11 きりっ
12 あほ〜
13 あほ〜
14 きりっ
15 あほ〜
16 きりっ
17 きりっ
18 あほ〜
19 きりっ
20 きりっ
21 あほ〜
22 きりっ
23 あほ〜
24 あほ〜
25 きりっ
26 きりっ
27 あほ〜
28 きりっ
29 きりっ
30 あほ〜
31 あほ〜
32 あほ〜
33 あほ〜
34 あほ〜
35 あほ〜
36 あほ〜
37 あほ〜
38 あほ〜
39 あほ〜
40 きりっ
~~~
40で「きりっ」に戻るところが何とも言えない可笑しさがある。

***Green_helmet@bethlehem4099·7月12日***

### さらに複雑なif 
~~~Ruby:sekaino_nabe_atsu35.rb　独自
def sekaino_nabe_atsu35
    for n in 1..41 do # 1から41までの数n
        if  (n / 10 ==3  ||  n % 10 ==3 || n % 3 ==0) && (n % 5 ==0) then
            print n / 10 ,  n % 10 , " あほわん〜\n"
        elsif n % 5 ==0 then
            print n / 10 ,  n % 10 , " わん\n"
        elsif n / 10 ==3 ||  n % 10 ==3 || n % 3 ==0 then
            print n / 10 ,  n % 10 , " あほ〜\n"
        else
            print n / 10 ,  n % 10 , " きりっ\n"
        end
    end
end

sekaino_nabe_atsu35
~~~

~~~command_line:command_line
~ % ruby sekaino_nabe_atsu35.rb
01 きりっ
02 きりっ
03 あほ〜
04 きりっ
05 わん
06 あほ〜
07 きりっ
08 きりっ
09 あほ〜
10 わん
11 きりっ
12 あほ〜
13 あほ〜
14 きりっ
15 あほわん〜
16 きりっ
17 きりっ
18 あほ〜
19 きりっ
20 わん
21 あほ〜
22 きりっ
23 あほ〜
24 あほ〜
25 わん
26 きりっ
27 あほ〜
28 きりっ
29 きりっ
30 あほわん〜
31 あほ〜
32 あほ〜
33 あほ〜
34 あほ〜
35 あほわん〜
36 あほ〜
37 あほ〜
38 あほ〜
39 あほ〜
40 わん
41 きりっ
~~~

***Green_helmet@bethlehem4099·7月13日***
### つぎ、unles
~~~Ruby:unless.rb
a="ルビー"
b="Ruby"
unless a==b then
    puts"a!=b"
else
    puts"a==b"
end
~~~
~~~command_line:command_line
➜  ruby unless.rb
a!=b
~~~

unless、うん確かにあったらプログラムはキレイになるがはたして必要なのか？
ifで条件にnotをつけるのではダメなのか？

***Green_helmet@bethlehem4099·7月14日***

### つぎ、caseとwhen

~~~Ruby:case.rb
# case.rb
array=["a",1,nil]
array.each do |item|
    case item
        when String
            puts "String"
        when Numeric
            puts "Numeric"
        else
            puts "nil"
        end
end
~~~

~~~command_line:command_line
➜  ruby case.rb
String
Numeric
nil
~~~
これは理解しがたいな、Stringはis_stringなのか？
いや、1ページ飛ばしてた
***Green_helmet@bethlehem4099·7月14日***
~~~ruby:case_class_if.rb
# case_class_if.rb
array=[ "a", 1, nil ]
array.each do | item |
    if String === item
        puts "String"
    elsif Numeric === item
        puts "Numeric"
    else
        puts "nil"
    end
end
~~~
~~~command_line:command_line
➜  ruby case_class_if.rb
String
Numeric
nil
~~~

ifで書くと上に等しいのか
===は==より広い、ふーん
あっ、もしかしてwhenの後は等式===を書く必要が無いのか、それは便利
でも、whenの後に不等式>=は書けないのかな。

~~~ruby:case_none.rb
range=[-1,10,100]
range.each do | x |
    case
        when x<0
            puts "Minus"
        when x>1 && x<99
            puts "1<x<99"
        when x>=100
            puts "x>=100"
        end
end
~~~
~~~command_line:command_line
➜  ~ ruby case_none.rb
Minus
1<x<99
x>=100
~~~
書ける。case後、xを書かない
まあ、そうかな、気が利いてる
***Green_helmet@bethlehem4099·7月15日***

### つぎ、one line if
~~~irb:irb
irb(main):008:0> a=4
=> 4
irb(main):009:0> 2 if a>3
=> 2
~~~
うん、良い。
***Green_helmet@bethlehem4099·7月15日***
***午前0:51 · 2022年7月15日***
~~~ruby:one_line_if.rb
x=100
y=1 if x>0
# y=1 if x>0 else -1
puts y
~~~
~~~command_line:command_line
➜  ~ ruby one_line_if.rb
1
~~~
One line ifでelseが使えないみたいだ、残念

***Green_helmet@bethlehem4099·7月15日***
~~~ruby:abs1.rb
def abs1(x)
    if x>=0 then
        x
    else
        -x
    end
end

puts abs1(-10)
~~~
~~~command_line:command_line
➜  ~ ruby abs1.rb
10
~~~
こういう冗長な書き方を
~~~ruby:abs2.rb
def abs2(x)
    x if x>=0 else -x
end

puts abs2(-10)
~~~
~~~command_line:command_line
➜  ~ ruby abs2.rb
abs2.rb:3: else without rescue is useless

    x if x>=0 else -x
~~~
こう短く書きたかったんだが出来ない。
これでRubyの条件判断はおしまい。どっとはらい。
***Green_helmet@bethlehem4099·7月15日***