やむを得ずif !hoge?
で緊急避難的に切り抜けたそうです。
早速出たばかりのRuby 2.6.0で試しました。なお、私のpry
のプロンプトはカスタマイズして短くしてあります。
» if true
» puts 'hoge'
» elsif false
» puts 'not hoge'
» end
hoge
» unless true
» puts 'hoge'
» elsif true
SyntaxError: unexpected elsif, expecting end
elsif true
^~~~~
たしかにunless
ブロックでelsif
を使った時点でSyntaxErrorになりました。
何はともあれ、公式情報を見てみます。
unless
はif
と反対で、条件式が偽の時にthen
以下の式を評価します。unless
式にelsif
を指定することはできません。
docs.ruby-lang.orgより
はみだしつっつき
「ちなみにunless
でelsif
は使えないけど、else
は使える😎」「あーそうだった」
» unless true
» "not true"
» else
» "true"
» end
#» "true"
「でもunless
でelsif
が使えないようになってるのは何となくワカル: そもそもunless
で使うelsif
の挙動がわかりにくいし、それを許すと今度はelseunless
みたいなのも欲しいとかなってどんどんカオスになりかねないし」「たとえ仕様でelsif
の挙動を定めたとしても、字面で混乱呼びそうですね😱」
「推測だけど、unless
でelsif
を許さないようになっているのは、言語設計者の意図なんじゃないかなー🤔」「私もそんな気がします」
「以下の関連記事にもありますけど、unless
ってよっぽど条件がシンプルでelse
も要らなくて、かつif
よりunless
の方が読みやすい場合ぐらいにしか使わない方がよさそう: ガード構文とか」「でもガード構文でunless
使うのはそれはそれでアンチパターン↓」「あ、そうか」「個人的にはunless
がそもそもアンチパターンぐらいに思ってるし」
def foo(a)
return unless a.innocent? # unlessガードはよろしくない
# 何かする
end
「ガード構文でunless
使うぐらいなら、条件判定用のメソッドを1つ追加して、それをガードのif
の条件に置く方がRubyらしく書けるし↓」「確かに、if
のガードに!
を持ち込むよりずっと素直で読みやすいですね😋」
def foo(a)
return if a.evil?
# 何かする
end
...
def evil?
!self.innocent?
end
おたより発掘
Ruby: unless式にはelsifを書けない
仕様として正しいと思う😓https://t.co/1dVuGyhSMj
— fatal flaw (@yamukotonaku) February 1, 2019
unlessガード割とやるけどよろしくないのなんでじゃろ?もちろん&&とかそういうの混ぜて使うっていうのはやらないけどシンプルな形式ならいい(むしろギプスになる)と思ってるマンだけどなぁ / Ruby: unless式にはelsifを書けない https://t.co/xS7je2FJBH
— ごまてゃんさん (@gomachan46) February 1, 2019