背景
Railsでアプリケーションを作っていて、空文字判定の実装をしました。
当然 blank?
を使用したわけですが、思ったより優秀で驚いた話です。
String.blank? の動作
空文字
一番ベーシックなタイプです。これは当然true。
irb(main):001:0> ''.blank?
=> true
半角スペース
これも可能なら対応してもらいたいところだが... → true
irb(main):002:0> ' '.blank?
=> true
半角スペース(複数)
これはブランクと言えるのか...? → true
irb(main):003:0> ' '.blank?
=> true
全角スペース
これは流石に... → true
irb(main):004:0> "\u3000".blank?
=> true
全角スペース(複数)
もうわかってきた。これはtrue! → true
irb(main):005:0> "\u3000\u3000\u3000\u3000".blank?
=> true
改行
まさかこれも...? → true
irb(main):014:0> '
irb(main):015:0' '.blank?
=> true
全角スペース + 改行
falseにしたい...! → true
irb(main):022:0> "
irb(main):023:0' \u3000
irb(main):024:0'
irb(main):025:0' ".blank?
=> true
文字列「aaa」
少し心配になってきたので、念のため... → false
irb(main):006:0> 'aaa'.blank?
=> false
Rubyのメソッドではなくて、Railsで実装されている
これはrailsで実装されているのであって、Rubyでは使えません。
irb(main):001:0> ''.blank?
Traceback (most recent call last):
2: from /Users/yoshinori/.rbenv/versions/2.5.3/bin/irb:11:in `<main>'
1: from (irb):1
NoMethodError (undefined method `blank?' for "":String)
終わりに
文字列か有効かどうか判断するのに 'blank?' が優秀なことがわかりました。
'present?' は 'blank?' の真逆になります。
すごく便利。