質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

3回答

1617閲覧

rubyのunlessの使いどころ

test0001

総合スコア224

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/09/07 14:47

unlessの必要性がいまいち分からないので教えてください。

unless

ruby

1unless hoge.present? 2 # blank 3end

ブランクチェックは下記の方が見やすいと思うのですがどうでしょうか。

ブランクの場合の処理する

ruby

1if hoge.blank? 2 # blank 3end

存在する場合処理する

ruby

1if hoge.present? 2end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

否定的な意味のメソッドが必ずしも用意されていない場合がありますので、「○○でない場合は~」という意味で使うなら有効なときがあります。ただ、ぶっちゃけて言うとif !hoge.present?if not hoge.present?でもいいと思っています(Ruby Style Guideではunlessを使うことを推奨していますが)。

Rubyのスローガンの一つに「多様性は善」というのがあると言われています。Perlほどではありませんが、あってもいいのではという手段は複数用意するのがRubyのポリシーです。これは、やり方がなるべく一つだけになるようにした(言い換えれば、誰が書いても同じコードになるようにした)Pythonや、文法を最低限にするためにwhileすら排除したGo等とは対照的です。必要だから用意している、ではなく、そういうのもありだよねという感覚で用意しているのがRubyだと思います。それが良いと思うか悪いと思うかは人それぞれですし、ここら辺の感覚的違いが、PythonistaとRubyistの分かれ道だと個人的には思っています。

まぁ、forに比べれば、まだunlessは結構使える子だと思いますよ。

投稿2017/09/07 15:17

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

if !if notはまず書かないので、そういうケースは除外する(unless優勢)として、
質問にあるような、if ~unless ~のケースだと「どちらが条件としてわかりやすいか」なのでケースバイケースだと思います。

私がよく使うのは、繰り返しのブロックの中で、

Ruby

1~~~ do |x| 2 next unless x.条件 3 ~~~※1 4end

のような使い方ですね。※1の部分では、条件が真であることが保証されているという意味。

Ruby

1~~~ do |x| 2 if x.条件 3 ~~~※1 4 end 5end

と同じですが、最初にジャンプ(next)してしまうのが好きです。ifだと「ifが終わった後どうなるんだろう?」と思いながら、読み進めることになります。最初にジャンプしてしまうと、条件を満たさない場合は何もしないことが明示できます。
メソッド定義でも最初に条件判断してリターンしてしまうというのはよく使います。

条件が1つだけでなく複数並ぶときには、

Ruby

1~~~ do |x| 2 next unless x.条件1 3 next unless x.条件2 4 next unless x.条件3 5 ~~~※1 6end

Ruby

1~~~ do |x| 2 if x.条件1 and x.条件2 and x.条件3 3 ~~~※1 4 end 5end

の比較ですね。どちらが良いかはケースバイケース(条件のわかりやすさ次第)でしょうか。

投稿2017/09/08 03:02

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ruby

1def hoge(i) 2 i>5 3end 4 5if !hoge(1) 6 puts 'hoge' 7end 8 9unless hoge(1) 10 puts 'hoge' 11end

のようなときに
『if,hoge,1,と見ていって』『hoge(1)の処理でfalseが返ってきて』『!で反転させてture』『ifの条件に合う』『だから中を実行』
って考えるのと、
『unless,hoge,1と見ていって』『hoge(1)の処理でfalseが返ってきて』『unlessの条件に合う』『だから中を実行』
って考えるのだと反転分の脳みその処理が要らないのでちょっと楽じゃないでしょうか?

絶対必要というほどのことではないですが、ちょっとだけ疲れにくくなります。

投稿2017/09/07 16:23

oskbt

総合スコア1895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問