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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

678閲覧

railsの構文を理解したい

k499778

総合スコア599

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/05/22 11:02

編集2021/05/22 11:05

前提・実現したいこと

元々Javaでしたが、現在Railsの開発に携わっています。

以下のようなコードが有りました

ruby

1def hoge 2 hoge.presence || ActiveRecord::Base.transaction(isolation: :read_committed) do 3 fuga = User.find(1).lock! 4 fuga 5 end 6end

hoge.presence ||の「||」の使い方はどういう意味でしょうか?
if文ならorの認識ですが、「hogeが存在する、または、」のあとの条件がよくわかりません。


メソッド末尾のfugaは必要でしょうか?
「fuga = Book.find(1)」だけでも「retrun fuga」の役割もしそうですが、わざわざ末尾のfugaを書いたほうがいい理由はありますでしょうか?

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

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

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

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

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

m.ts10806

2021/05/22 11:06

コードの出典は何でしょう。
k499778

2021/05/22 11:09

仕事関連です
k499778

2021/05/22 11:09

何を気にされてますか?
m.ts10806

2021/05/22 11:41

自身で書いたコードのようでなければ「どこから持ってきたものなのか」が気になるのは自然かと思います。 ネットから拾ってきたものなら記事の作者に聞くこともできますし 課題なら出題者です。 業務のコードなら「そもそも世界中からアクセスされる場所に出していいのか」というコンプライアンスな観点も問題になってきます。
k499778

2021/05/22 11:48 編集

なるほどです。 仕事関連なので、コンプライアンスの観点は気にしており、具体的なところは濁してご提示させて頂いております。
guest

回答2

0

Javaにもショートサーキットはあるかと思います。

java

1String str = foo(); 2if (str == null || str.isEmpty()) { 3 return true; 4}

java

1String str = foo(); 2if (!(str == null)){ 3 if (str.isEmpty()) { 4 return true; 5 } 6}

なのと同様に質問のコードは

ruby

1def hoge 2 if !hoge.blank? # hogeが存在し空白や空集合ではない時 3 hoge 4 else 5 ActiveRecord::Base.transaction(isolation: :read_committed) do 6 fuga = User.find(1).lock! 7 fuga 8 end 9 end 10end

と、なります。


fuga = ~の後にfugaを評価する意味ですが
特殊な場合には存在しえます。

ruby

1def fuga 2 @fuga 3end 4def fuga=(_) 5 @fuga = _ * 2 6end 7 8p(self.fuga = 3) # => 3 9p(fuga) # => 6

投稿2021/05/22 11:56

asm

総合スコア15149

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

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

otn

2021/05/22 11:59

なるほど。変数であると思い込んでました。あり得ますね。
asm

2021/05/22 12:02

これ書いてる最中に代入風メソッドの呼び出し時には右辺が式の評価値になって メソッドの評価が捨てられるという仕様を初めて知りました。
k499778

2021/05/22 12:06 編集

ありがとうございます。 はい、ショートサーキットの考え方はわかります。書き方として、ifを使っていないパターンに慣れていませんでした。 なるほど。戻り値の方はパッと理解できていないですね。少し調べてみます
otn

2021/05/22 12:11

そもそもメソッドなら副作用もあり得るので、その面でも書く書かないで違い得ます。
guest

0

ベストアンサー

式1 || 式2は、式1が偽の時だけ式2を評価するので、

Ruby

1def hoge 2 x = hoge.presence 3 if x 4 x 5 else 6 ActiveRecord::Base.transaction(isolation: :read_committed) do 7 fuga = User.find(1).lock! 8 fuga 9 end 10 end 11end

のような意味です。

最後のfugaが不要というのはその通りです。
この場合は、fugaという変数そのものが要らないですね。

投稿2021/05/22 11:27

otn

総合スコア85949

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

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

otn

2021/05/22 11:35 編集

> if文ならorの認識ですが if であろうがなかろうが or です。
k499778

2021/05/22 11:30

なるほどです! ORのそのような使い方があるのですね。 returnに関してもありがとうございます。あえて明示的に書くことで何か狙いがあるのですかね。dryじゃないからやっぱりよくないですかね。 とりあえず自分の認識が大きく間違っていないことがわかって感謝です
otn

2021/05/22 11:34

変数fuga意味があるとすると、変数に代入するのは、値に名前を付けるという意味もあるので、 「User.find(1).lock! は fuga というものだよ」というメッセージ的な意味でしょうか。 a ||= foo つまり a = a || foo というのはよく使いますね。a が nil (またはfalse)の時のみメソッドfooが呼ばれます。
k499778

2021/05/22 11:44

ありがとうございます。 ちなみにjavaではOR演算子を使うときはifがあったため、少しこの書き方に慣れていないのですが、ifを省略して書けるのですかね。 調べにくいな感じているのですが、どのように調べればいいとかありますでしょうか?(検索用語やオススメのリファレンスなど)
otn

2021/05/22 11:57 編集

> javaではOR演算子を使うときはifがあったため、 Javaでも x = y || z; というのはありますね。 今回に近い例だと return a || b; みたいな。 > どのように調べればいいとかありますでしょうか? これは調べる話じゃなくて、考える話だと思います。|| の意味がわかっている前提ですが。
k499778

2021/05/22 11:58

ありがとうございます。 たしかにOR演算子の考え方を利用した書き方な感じがしますね。 あまりJavaでこのような書き方をしなかったため慣れていませんでした。。 https://techacademy.jp/magazine/22204 対象化するなら「連続式」とした言い方・考え方が一番しっくり来ました。 ありがとうございました。
otn

2021/05/22 12:05

> 対象化するなら「連続式」とした言い方・考え方が一番しっくり来ました。 「連続式」は、多分、このページ独自用語ですね。他では通じないと思います。忘れましょう。
k499778

2021/05/22 12:09 編集

そうなんですね。。 ま、公式でないかもしれませんが 少なからず「rails 連続式」でググると、自分が知りたい情報がいくつか出てくる点では無意味ではないかもしれません。 公式用語でないことは理解しておきます
otn

2021/05/22 12:14

「rails "連続式"」でググると全く出てこないですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問