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
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
➜ ~ 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
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
~ % 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
a="ルビー"
b="Ruby"
unless a==b then
puts"a!=b"
else
puts"a==b"
end
➜ ruby unless.rb
a!=b
unless、うん確かにあったらプログラムはキレイになるがはたして必要なのか?
ifで条件にnotをつけるのではダメなのか?
Green_helmet@bethlehem4099·7月14日
つぎ、caseとwhen
# 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
➜ ruby case.rb
String
Numeric
nil
これは理解しがたいな、Stringはis_stringなのか?
いや、1ページ飛ばしてた
Green_helmet@bethlehem4099·7月14日
# 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
➜ ruby case_class_if.rb
String
Numeric
nil
ifで書くと上に等しいのか
===は==より広い、ふーん
あっ、もしかしてwhenの後は等式===を書く必要が無いのか、それは便利
でも、whenの後に不等式>=は書けないのかな。
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
➜ ~ ruby case_none.rb
Minus
1<x<99
x>=100
書ける。case後、xを書かない
まあ、そうかな、気が利いてる
Green_helmet@bethlehem4099·7月15日
つぎ、one line if
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日
x=100
y=1 if x>0
# y=1 if x>0 else -1
puts y
➜ ~ ruby one_line_if.rb
1
One line ifでelseが使えないみたいだ、残念
Green_helmet@bethlehem4099·7月15日
def abs1(x)
if x>=0 then
x
else
-x
end
end
puts abs1(-10)
➜ ~ ruby abs1.rb
10
こういう冗長な書き方を
def abs2(x)
x if x>=0 else -x
end
puts abs2(-10)
➜ ~ ruby abs2.rb
abs2.rb:3: else without rescue is useless
x if x>=0 else -x
こう短く書きたかったんだが出来ない。
これでRubyの条件判断はおしまい。どっとはらい。
Green_helmet@bethlehem4099·7月15日