Rubyでnilとfalseを区別する方法が他にもある話
他にもいろいろあるという話をTwitterで聞きました。下のツイートから大体見られるんじゃないかな。
なんとかKaigiに合わせて、と思いきや全然関係ない内容でRubyの記事を書きました。 #はてなブログ
— 松本宗太郎 (@soutaro) May 30, 2018
Rubyでnilとfalseを区別する方法 - soutaroブログhttps://t.co/o9DYnwwknl
TracePointで私のアイディアを騙すとか、引数の評価に入れるとTracePointを回避できるとか、 $@
に false
を代入すると例外が上がるとか、 false..nil
にして確実に例外が上がるようにするとか、いろいろな方法があることがわかりました。Rubyの勉強になりますね。
今の時点で決定版かなーと思っているのは
rangeリテラル、trunkでも動くように直してTracePoint対策するとこういう感じですかね
— Ⓜ️ (@hanachin_) May 30, 2018
def nilp(v, _=(return (not v&.(nil..false)) rescue return false))
end
ですかねぇ。(わかりませんが。)
一つだけわかったこととしては、「Ruby 2.3より前では nil
と false
が区別できなかった」というのは間違いかも、というところで、一筋縄ではいきませんでしたが2.3以降でやるときと同程度の仮定で nil
と false
を区別できていたような気がします。
ちなみに、「 is_nil?
を呼び出す方法がない」というのがオチのつもりでした。(誰かに上書きされないことが保証できないので。)