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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

719閲覧

Ruby or Railsでわからない構文があるので理解したい

k499778

総合スコア599

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/04/23 00:21

前提・実現したいこと

元Javaエンジニアです。
現在Railsで開発しています。
そのコードの中に以下のようなコードが有りました。

ruby

1a = if b 2 c = 処理A 3 else 4 [] 5 end 6

if文がaに代入されているように見えるのですが、これはどういう処理なのでしょうか?
if文の結果をaに代入している。でいいのでしょうか?bがtrueならc、bがfalseなら[]がaに代入されると。
気になるのは、if文がaに代入されているところです。Javaではあまり見かけない記法なので引っかかりました。

また、このような記法の調べ方やリファレンスなどあれば教えていただきたいです。

試したこと

  • 「if文 代入 rails」「if文結果代入 ruby」などで検索

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

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

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

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

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

guest

回答2

0

ifも式です。
制御構造 if (Ruby 3.0.0 リファレンスマニュアル)

if 式は、条件が成立した節(あるいは else 節)の最後に評価した式の結果を返します。else 節がなくいずれの条件も成り立たなければ nil を返します。

他の制御構文やメソッド定義なども値を持ちます。whilenilだったりしますが、何かに代入してもエラーにはならないです。

Ruby

1a = def foo; p 123; end 2p a #メソッド名のシンボル

投稿2021/04/23 00:42

otn

総合スコア85901

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

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

maisumakun

2021/04/23 00:45

defは昔はnilを返していたのですが、「private def method」のような書き方が成立すると便利ということで、Ruby 2.1からdefがシンボルを返すようになりました。
k499778

2021/04/23 00:49

ありがとうございます!
otn

2021/04/23 00:49

あ、「defが値を持つことは何か意味があるのですか?」という質問者からのコメントを期待していたのですが。。。
k499778

2021/04/23 00:51

気にはなりましたが、if式の理解がまだ追いついていませんでした。。
k499778

2021/04/23 00:59 編集

if文ではなくif式であり、代入したりすることができるところまでは腑に落ちています。 しかし、そこから先はもう少し自分の中で噛み砕く必要がありそうです。 「defが値をもつ」という言葉自体がまだピンときていません。。 またそれができると何が嬉しいのかがよくわかっていないため、実用的に使う場面のイメージができていないです。。 もう少し自分で調べてみます
otn

2021/04/23 01:00

普通に考えると、「メソッド定義が値を持つって?」なんで、昔は nil だったんだけど、 (nilでも値なので、代入は出来ますが) 「メソッド名のシンボルを返せば、 def foo~~end private :foo じゃなくて private def foo~~end と書ける!」と思いついた人がいたようで、maisumakunさんのお書きのように途中で変更になっています。
k499778

2021/04/23 01:07

なるほどです。そのような経緯があっのですね。メソッド定義が値を持てるのですね。 正直いうと、 メソッドは処理名という認識で「定義が値を持つ」ということ自体でまだあまりピンときていません。。Javaの発想だからなのか…Rubyならではのことなのか… メソッドは処理を定義して、それを呼び出すことでdryに書けるのが大きな特徴のひとつという認識でした。 メソッド定義が値を持つとは?というところで引っかかっています。 もう少し調べてみます!
maisumakun

2021/04/23 01:18 編集

> メソッドは処理名という認識で「定義が値を持つ」ということ自体でまだあまりピンときていません。。 Javaはクラス直下にメソッドやフィールドの宣言・定義しか書けませんが、Rubyではクラス直下も実行コードになっていて、メソッドを呼び出すようなことも可能です(Railsのモデルに書くvalidatesやhas_manyも、そうしたメソッドの1つです)。 defもメソッド定義を行う「実行文」であって、返り値を持てるのです。
k499778

2021/04/23 20:02

なるほどです!少し体感を持てるように色々調べたり試したりしてみます! ありがとうございます^ ^
guest

0

ベストアンサー

if文がaに代入されているように見えるのですが、これはどういう処理なのでしょうか?

そのとおりです。Rubyではifも、結果を持つなのです。

投稿2021/04/23 00:29

maisumakun

総合スコア146018

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

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

maisumakun

2021/04/23 00:30

Javaではifは文なので、「ifの結果を変数に代入する」書き方は成立しません。
k499778

2021/04/23 00:31

ありがとうございます! ちなみに調べるコツやどのように調べられたかなどお聞きすることはできますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問