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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

550閲覧

rubyの三項演算子

domidomi

総合スコア34

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/02/21 03:42

小さな疑問なのですが調べても解決しなかったので質問させていただきます・・・
##疑問
ルビーにて
false ? pp "hoge" : pp "fuga"
がエラーになってしまう原因は何ですか?

pp "hoge"pp "fuga"
それぞれ単独で実行した場合上手くいきます。

条件 ? 式1 : 式2
の式に入れるものの条件があるのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

単純に文法エラーを直すだけならば、
()で囲んで明示してあげれば良さそうです。

ruby

1false ? pp("hoge") : pp("fuga")

または

ruby

1false ? (pp "hoge") : (pp "fuga")

投稿2018/02/21 03:59

編集2018/02/21 04:04
namnium1125

総合スコア2043

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

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

domidomi

2018/02/21 06:07

回答ありがとうございます。 疑問なのですがなぜ括弧で囲う必要があるのでしょうか? 括弧で囲う必要のある式と囲う必要のない式の違いが明確にできないと、三項演算子を使うのはやっぱりやめたほうがいいかなと考えています・・・
namnium1125

2018/02/21 14:29 編集

tacsheaven様のコメントにある通りですね。 私は普段rubyはやらないのですが、どの言語にも言えることは複数解釈ができそうだとまずいということです。 もうちょっと抽象的な例えだとこんなイメージでしょうか?↓ 小学生の時に、こんなことをしませんでしたか? 「私は兄と走る弟を追いかけました。」 「兄と弟」を追ったのでしょうか? それとも「弟だけ」を追ったのでしょうか? 国語なら文脈判断でいいかもしれませんが、プログラミングだとこういう文章はまずいんです。 そこをはっきりさせるための括弧です。 「私は(兄と走る弟)を追いかけました。」 プログラミングでこういう文に出会った時、明示しなくてもエラーにならないことも多いですが、迷ったら(可読性を失わない程度に)括弧でくくってみるといいと思います。
domidomi

2018/02/21 07:06

返信ありがとうございます。 修飾関係が一意じゃないとダメという事ですよね? 条件 ? 式1 : 式2と「;」無しで1行にあった時点で、?から:までの中身が一つの塊として考えられて、「pp "hoge"」という塊を評価し始めるというながれかと思いましたが違うというなのですね。
namnium1125

2018/02/21 08:55

まぁ、確かにエラーにならず実行されるパターンだけを考えると、質問者様の仰る通りの処理一通りに決まるように見えますけど、 その辺りはrubyの言語実装によるので、なんとも言えないですね。 ラフに書けるというのは、rubyの長所であり欠点なのかもしれません。
domidomi

2018/03/12 02:07

遅くなりましたベストアンサーを付けるのを忘れておりました、親切な回答ありがとうございます。
guest

0

やりたいことからすると、

Ruby

1pp {何か}.false ? "hoge" : "fuga"

という形になるはずですが。
pp は後ろの式の内容を出力するので、その式の制御を三項演算子でやればよいのです。

投稿2018/02/21 03:50

tacsheaven

総合スコア13703

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

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

domidomi

2018/02/21 06:08

回答ありがとうございます。 しかし、なぜ質問の形だとダメなのかの原因が知りたいのです。
tacsheaven

2018/02/21 06:26

端的に言えば、pp {何か} というのは、「文」であって、狭義の「式」ではないからです。 Ruby においてはプログラムは式の組み合わせですが、その式の中には「メソッドの引数にできない式」があります。これを「文」と呼ぶことがあります。 三項演算子の式1、式2には、メソッドの引数にできない式は書けないのです。 ただし、メソッドの引数にできない式をまるごと括弧で囲むと、これは普通の式になります。 ですから namnium1125 さんの書かれた形であれば文法上問題がないのです。
domidomi

2018/02/21 07:04

返信ありがとうございます。 :が一つしかない事と、pp {何か} の{何か}も一つしかない為、一意に意味を読んでくれると思ったのですがその機能はないという事なのですね。もしくはppの考え方がだいぶ間違っている気がしてきました。 pp ("hoge" : pp "fuga")の可能性があるため正しく評価されていないということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問