読者です 読者をやめる 読者になる 読者になる

Crystal の型を絞り込む場合は is_a? を使うしかなくてつらい

Crystal Ruby

これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の20日目の記事です。

qiita.com

昨日の記事で、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 でエラーにならなくなりました。