これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の20日目の記事です。
昨日の記事で、File#gets
が nil を返すことがあるので、
line = File.open("/dev/urandom").gets if line.is_a? String # gets は nil を返すことがあるためこの if が必要 p line.size
と書いたのですが、Ruby のような感じで次のようには書けません。
if line p line.size end
line && line.size
ユニオン型(複数の型になりうるオブジェクトの型)から特定の型の場合だけの処理を行いたい場合は、if obj.is_a?
を使うしかないようです。
if line.is_a? String p line.size end
unless line.is_a? Nil p line.size end
ちょっとつらい。
[追記]
何か勘違いしていたようで、次のどちらもちゃんと期待通りに動きました。Crystal さん、ごめんなさい。
if line p line.size end
line && line.size
さらに追記 2016-05-14
次のように if ではなく else で評価するとエラーになります。
if !line # nil else p line.size end
だったのですが、0.15 でエラーにならなくなりました。