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

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

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

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

Q&A

解決済

2回答

689閲覧

[Ruby]三項演算子について、理解ができません。

yomigi

総合スコア43

Ruby

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

1グッド

1クリップ

投稿2018/01/24 08:16

あるRubyのコードを解読しているところなのですが、以下のようなコードがありました。

Ruby

1def piyo 2 puts "piyopiyo" 3end 4 5@hoge ||= huga.nil? ? "hogehoge" : piyo

このようなコードなのですが、一体どのような処理を意味しているのでしょうか?
@hoge~以下の三項演算子の部分が理解できません。
諸事情により、大元のコードは載せることができないのが申し訳ないのですが、
どなたかご教授お願いいたします。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

理解すべきことは二つ

三項演算子とRubyの||=というイディオムについてです

三項演算子とは

三項演算子は一行で表現するif構文のようなものです

まずは話を単純化するために下記の一行についてのみ考えます

ruby

1huga.nil? ? "hogehoge" : piyo

?が二個あって混乱しそうですがhuga.nil?で一つの式です

三項演算子自体は下記のような感じになります

ruby

1'条件' ? '条件がtrueの時の値' : '条件がfalseの時の値'

これはif構文に直すと下記と同じです

ruby

1if '条件' 2 '条件がtrueの時の値' 3else 4 '条件がfalseの時の値' 5end

Rubyの||=というイディオムの意味

そして ||= ですが、これは
左辺が未定義または偽の場合に右辺の値を代入するという意味の式になります

ruby

1@hoge = nil 2@hoge ||= "hoge" 3# @hoge は "hoge" 4 5@fuga = "fuga" 6@fuga ||= "fugahoge" 7# @fuga は "fuga"

結論

ruby

1@hoge ||= huga.nil? ? "hogehoge" : piyo

上記は、
@hogeがtrueの場合何もしない、
@hogeが未定義または偽の場合、huga.nil? ? "hogehoge" : piyoの結果を代入する
と、なります

投稿2018/01/24 08:53

mtdsnsk

総合スコア789

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

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

0

三項演算子 A ? B : C は、A が真ならば B を、そうでないならば C を値とします。
ですから

Ruby

1@hoge ||= huga.nil? ? "hogehoge" : piyo

は、
huga.nil? の結果が真(=huga が nil)ならば "hogehoge" を、
そうでないならば piyo の結果を、
@hoge が偽ないし未定義の場合に設定(||=)します。

余談:

Ruby

1def piyo 2 return "piyopiyo" 3end

じゃないですか? 挙げられた例のままだと、hoge が nil でないとき、標準出力にpiyopiyo が出て、@hoge には何も入りません。

投稿2018/01/24 08:34

編集2018/01/24 09:00
tacsheaven

総合スコア13703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問