0
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.

if文においてnilも偽となれるの意識できてますか?

Last updated at Posted at 2023-10-29

はじめに

プログラミングにおいてif文は相当な頻度で使われていると思いますが、どんな時に使っていることが多いでしょうか?:open_mouth:

私はこのように
trueとfalseの時に使っているイメージが多かったです。

true?false?.rb
# 数値を使った条件
a = 1

if a > 0
  puts "aは1より大きいのでtrue:これは表示されます。"
end

if 1 < 0
  puts "aは1は0より小さいのでfalse:これは表示されません。"
end

しかし、処理結果がnilであった場合も
処理内容をスキップして使ったことはありますか?

if文のおさらい

すごい基礎的なことですが、if文は条件文の処理結果が真であれば指定した処理内容を実行、偽であれば処理内容を実行しないものとなります。

ただ、偽 = falseのイメージが強く、
nilも偽として扱っているのを忘れていくことありませんか?:open_hands:

つまり、以下の通りになります:point_up:

if_explanation.rb
if 条件文の処理結果はtrue?false?nil?
 "trueだったら処理文の実行"
end

falseとnilだったら処理スキップ
if_explanation.rb
if true
  puts "これは実行されます"
end
#=> 出力あり:これは実行されます

if false
  puts "これは実行されません"
end
#=> 出力なし

if nil
  puts "これも実行されません"
end
#=> 出力なし

処理結果がnilの時の例文

では、条件文の処理結果がnilだと偽となることはどのように利用できるのでしょうか??

例えば、動物を入力するとスコア化するプログラムがあるとします:rolling_eyes:

(ネコとイヌは特に私が好きなので点数を高く設定しています:joy:)

コードは少し長いので全部見なくても大丈夫です!

animal_score.rb
puts "動物は何匹を教えてください"
N = gets.chomp.to_i

# 入力した値を収める箱をつくる
animal_array = []
# スコアの初期値
total_score = 0

N.times do |i|
  puts "#{i + 1}匹目の動物はなんですか?"
  animal = gets.chomp
  # 箱に入力した要素を入れる
  animal_array << animal
end

# 点数変換ルール
score_hash = {
  # ネコは10点
  'ネコ' => '10',
  # イヌは8点
  'イヌ' => '8',
  # トリは5点
  "トリ" => "5"
  # それ以外は1点
}

# 変換ルールにしたがって要素を数字に変換
animal_array.each do |animal|
  if score_hash[animal]
    # 指定の動物が存在する場合、"10"などを数字型に変換してその点数を加算
    total_score += score_hash[animal].to_i
  else
    # 指定の動物が存在しない場合(nilの場合)、1点を加算
    total_score += 1
  end
end

# 合計スコアの出力
puts "合計スコアは#{total_score}点です。"

ちなみに入力例と出力結果はこのような感じになります!

animal_result.rb
動物は何匹か教えてください
3
1匹目の動物はなんですか
 ヘビ
2匹目の動物はなんですか
ネコ
3匹目の動物はなんですか
トリ
合計スコアは16点です

今回のコードで注目してほしいのは以下の部分です

animal_result.rb
if score_hash[animal]
  # 指定の動物が存在する場合、"10"などを数字型に変換してその点数を加算
  total_score += score_hash[animal].to_i
else
  # 指定の動物が存在しない場合(nilの場合)、1点を加算
  total_score += 1
end
animal_result.rb
if score_hash[animal]

if文はtrueなら実行、falseとnilならスキップすると言いました。
したがって、if文の箇所はこのようになります。

score_hash[animal]はハッシュ[キー] = 値の構文です

animal_result.rb
if score_hash[animal]
# ⇓
if score_hash["ネコ"]
# ⇓
if "10"
# ⇓
if true(すなわち真)
# ⇓
total_score += score_hash[animal].to_i

これで入力した値がキーで用意していれば、
total_score += score_hash[animal].to_iが実行されます!

では、逆にキーで用意していない値だとどうなるのでしょうか?:frowning2:

animal_result.rb
if score_hash[animal]
# ⇓
if score_hash["へび"]
# ⇓
if nil(すなわち偽)
# ⇓
total_score += 1

入力した値がキーで用意されていなかったら、else下のtotal_score += 1の実行となります。

このように条件文の処理結果がnilであるかないかを利用して実用できることがあります。

いかがでしたでしょうか?
内容自体はすごく基礎的なことであると思いますが、私は意識できませんでした:sweat_smile:

長くなりましたが、ここまで読んで頂きありがとうざいました!お疲れ様でした:relaxed:

0
0
0

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
0
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?