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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

713閲覧

rubyでreturnしたい処理をメソッド化すると後続処理が走ってしまうので修正したい

k499778

総合スコア599

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/10/02 13:40

前提・実現したいこと

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

rubyにおいてですが、
returnすることによって、後続処理が実行されなくなると思います。
しかし、その処理をメソッド化するとreturnの箇所処理も実行されてしまいます。

メソッド化(リファクタリング)する際はどのようにすればいいのでしょうか?

試したこと

例えば以下のコードです

ruby

1 2if [true, false].sample 3 if [true, false].sample 4 p 'a' 5 return p 'ですよ' 6 end 7 8 p '真です' 9else 10 if [true, false].sample 11 p 'a' 12 return p 'ですよ' 13 end 14 15 p '偽です' 16end

上記は、以下のパターンの期待値です。
「a ですよ」「真です」「偽です」

以下の箇所が重複しているので

p 'a' return p 'ですよ'

これを以下のようにメソッド化すると

ruby

1 2def adesuyo 3 p 'a' 4 return p 'ですよ' 5end 6 7 8if [true, false].sample 9 if [true, false].sample 10 adesuyo 11 end 12 13 p '真です' 14else 15 if [true, false].sample 16 adesuyo 17 end 18 19 p '偽です' 20end

returnがメソッドの返却値の意味を持ち、期待値は以下のパターンです。
「a ですよ 真です」「a ですよ 偽です」「真です」「偽です」

期待値が変わってしまいます。
メソッド化前の期待値のまま、リファクタリングすることはできますでしょうか?
returnをメソッド内に含ませると意味が変わるので、リファクタリングする余地はないでしょうか。

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

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

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

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

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

guest

回答2

0

これでいいのか

ruby

1 2def adesuyo 3 p 'a' 4 throw :symbol, (p 'ですよ') 5end 6 7catch(:symbol) do 8 if [true, false].sample 9 if [true, false].sample 10 adesuyo 11 end 12 13 p '真です' 14 else 15 if [true, false].sample 16 adesuyo 17 end 18 19 p '偽です' 20 end 21end

投稿2021/10/02 15:19

編集2021/10/02 15:53
k499778

総合スコア599

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

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

k499778

2021/10/02 15:21

[MEMO] throwしたらcatchに入ってendまでスキップする
guest

0

ベストアンサー

adesuyoというメソッドを定義して、p a; return p "ですよ"adesuyoの呼び出しに書き換えたということでしょうか?
adesuyoの中にあるreturnadesuyoを終了させるだけです。これはJavaなどでも同じですね。

元のメソッドを途中で終了させたいなら、そのメソッドの中でreturnを書く必要があります。

一応、呼び出し先から呼び出し元の戻り先を変える大域脱出の機能はあります。
throw :xbar以降のendまでをスキップする。

Ruby

1def foo(a) 2 catch :x do 3 if a 4 bar 5 end 6 return p "引数は偽です" 7 end 8end 9 10def bar 11 p "a" 12 throw :x, (p "ですよ") 13end 14 15p "foo(真) の返り値 => #{foo(true)}" 16p "foo(偽) の返り値 => #{foo(false)}"

投稿2021/10/02 14:38

otn

総合スコア85901

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

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

k499778

2021/10/02 14:49

ありがとうございます!確認します!
k499778

2021/10/02 14:53

def adesuyo p 'a' throw :x, (p "ですよ") end if [true, false].sample catch :x do if [true, false].sample adesuyo end end p '真です' else catch :x do if [true, false].sample adesuyo end end p '偽です' end
k499778

2021/10/02 14:56

上記のように書き換えてみたのですが、結果が変わらないような気がして("a" "ですよ" "真です"と表示されるthrow以降も実行されてしまうパターン) なにか認識が違いそうでしょうか???? また、あまり実装で見かけないような気がしたのですが、railsの場合、また違う方法があったりしますでしょうか?????
otn

2021/10/02 15:07

元のメソッドを終了したいのであれば、処理全体を囲まないとだめです。 ということが、理解できなかったのであれば、当面、使うのは無理ですね。 def メソッド catch :x do ~~~ if [true, false].sample adesuyo end p '真です' else if [true, false].sample adesuyo end p '偽です' end ~~~ end # of catch end # of def メソッド > あまり実装で見かけないような気がしたのですが はい。ロジックの流れがわかりにくいから、ピタリはまるケース以外ではあまり使わないと思います。 > 元のメソッドを途中で終了させたいなら、そのメソッドの中でreturnを書く必要があります。 が普通でしょう。
k499778

2021/10/02 15:07

ご提示頂いたコードも実行したのですが "a" "ですよ" "foo(真) の返り値 => ですよ" "引数は偽です" "foo(偽) の返り値 => 引数は偽です" と出力されました。 真のときも「引数は偽です」ですが呼び出されているかもしれません????
otn

2021/10/02 15:22

わかりにくければ、 p "foo(真) の返り値 => #{foo(true)}" p "====================" p "foo(偽) の返り値 => #{foo(false)}" と書いてみてはどうでしょうか。
k499778

2021/10/02 15:30

ありがとうございます!理解しました????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問