目的
- 作業中バグが出てそれの修正が必要だったのでそれに対処した時のメモ
現象
期待値
nilの値を挿入時にエラーが出ないようにしたい
対策
[OK]
# nil対策(pryで確認できます)
# rubyにはnilになってしまう状態を防ぐために「nilガード」という書き方が存在
# nilガード => 「もし変数がnilだった場合、値を入れる構文」
# 変数aに nil を代入
a = nil
# もし変数がnilだった場合、空文字列を入れる構文
a ||= '' # => ""
p a # => ""
# 変数aに "お茶"を代入
a = "お茶"
# nilガードで判定
a ||= '' # => "お茶"
p a # => "お茶"
-----------------------------------------
[OKだけどイケてない]
#[2番目に書いた記述。「nilガード」の存在を知らない]
object.nil? ? '' : object
# 三項演算子で対策。nilだったら空文字列を返す
-----------------------------------------
# [NG]
# [最初に記述したコード:UTF-8でしか動かない処理の場合はダメ]
# nil対策
object.nil? ? object.to_s : object
# 三項演算子で対策。nilだったらto_sメソッド
# to_sは文字列に変換して文字列を返す
で上記現象のバグが修正できた。
pryでの確認 |
---|
nilの場合 | nilではない場合 |
---|---|
なぜ''
を使うのか?
s.to_s
と ''
では文字コードが違うため
# '' は<Encoding:UTF-8>
p ''.to_s.encoding #=> #<Encoding:UTF-8>
# .to_s は<Encoding:US-ASCII>
p nil.to_s.encoding #=> #<Encoding:US-ASCII>
余談
Rubyで nil.to_i は 0 を返す
[追記]
※UTF-8でしか動かない処理に投入するのであれば,s.to_s
は使ってはいけない。
Ruby で s が nil か String か分らぬとき s.to_s と s || '' はどっちがいい?