2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RubyAdvent Calendar 2022

Day 9

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

Last updated at Posted at 2022-12-11

Rubyの本、買ってきた。「たのしいRuby」勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。「たのしいRuby」の続き、条件判断
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon

参考文献

この記事は以下の情報を参考にして執筆しました。
-たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年
-『たのしいRuby 第6版』サポートページ、ソースコード

if文(if式?)

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

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
➜  ~ 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

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
~ % 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

unless.rb
a="ルビー"
b="Ruby"
unless a==b then
    puts"a!=b"
else
    puts"a==b"
end
command_line
➜  ruby unless.rb
a!=b

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

Green_helmet@bethlehem4099·7月14日

つぎ、caseとwhen

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
➜  ruby case.rb
String
Numeric
nil

これは理解しがたいな、Stringはis_stringなのか?
いや、1ページ飛ばしてた
Green_helmet@bethlehem4099·7月14日

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
➜  ruby case_class_if.rb
String
Numeric
nil

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

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
➜  ~ ruby case_none.rb
Minus
1<x<99
x>=100

書ける。case後、xを書かない
まあ、そうかな、気が利いてる
Green_helmet@bethlehem4099·7月15日

つぎ、one line if

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日

one_line_if.rb
x=100
y=1 if x>0
# y=1 if x>0 else -1
puts y
command_line
➜  ~ ruby one_line_if.rb
1

One line ifでelseが使えないみたいだ、残念

Green_helmet@bethlehem4099·7月15日

abs1.rb
def abs1(x)
    if x>=0 then
        x
    else
        -x
    end
end

puts abs1(-10)
command_line
➜  ~ ruby abs1.rb
10

こういう冗長な書き方を

abs2.rb
def abs2(x)
    x if x>=0 else -x
end

puts abs2(-10)
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日

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?