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

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

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

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

Q&A

2回答

3428閲覧

Rubyのmapメソッドの処理中にbreakしたい。

YYkanagawa

総合スコア16

Ruby

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

0グッド

0クリップ

投稿2021/07/06 13:44

編集2021/07/06 15:14

実現したいこと

以下のように、Ruby の mapメソッドの処理中にbreakし、それまでの処理の配列を取得したいです。
良い方法があれば、教えていただけると幸いです。

example

1numbers = 2 [1, 2, 3, 4, 5].map do |i| 3 i 4 break if i == 4 5 end 6 7p numbers 8=> [1, 2, 3] ⬅︎ breakするまでの結果が配列になるようにしたい 9 10=> nil ⬅︎ 実際はこうなる

以下のような空配列を用いた方法は無しでお願いいたします。

numbers = [] [1, 2, 3, 4, 5].each do |i| break if i == 4 numbers << i end p numbers => [1, 2, 3]

また、以下のようなnextを用いた方法も無しでお願いします。
条件に合致した時点でループを抜けたいです。

numbers = [1, 2, 3, 4, 5].map do |i| next if i >= 4 i end p numbers.compact! => [1, 2, 3]

補足

説明不足で申し訳ありません。
数字の配列を用いたのは具体例として挙げただけでして、以下のように特定の条件でループを抜け、それまでの処理結果の配列を返したいです。

strings = 10.times.map do break if rand(10) == 0 "hoge" end p strings ["hoge", "hoge", "hoge", "hoge"]

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

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

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

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

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

guest

回答2

0

あえてやるならば

ruby

1StopIter = Class.new 2 3p numbers = (1..).lazy 4 .map{|i| i != 4 ? "hoge" : StopIter.new } 5 .take_while{|i| !i.is_a? StopIter} 6 .to_a

まぁ空配列を初期値に用いた方がシンプルです

ruby

1numbers = (1..).reduce([]) do |memo, i| 2 break memo if i == 4 3 memo << "hoge" 4end 5 6p numbers

投稿2021/07/06 15:37

asm

総合スコア15149

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

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

0

「特定の条件の間だけ切り出したい」という条件であれば、Enumerable#take_whileるりま)を使えます。

ruby

1numbers = [1, 2, 3, 4, 5].take_while { |i| i != 4 }

投稿2021/07/06 14:50

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問