LoginSignup
3
3

More than 5 years have passed since last update.

[個人用メモ/nil対策]Rubyで nil.to_sは文字列に変換して文字列を返す。使うのはNG

Last updated at Posted at 2018-07-11

目的

  • 作業中バグが出てそれの修正が必要だったのでそれに対処した時のメモ

現象

Image from Gyazo

期待値

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ではない場合
Image from Gyazo Image from Gyazo

なぜ''を使うのか?

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 || '' はどっちがいい?

参考

to_s (Array)

3
3
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
3
3