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

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

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

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

Q&A

解決済

1回答

1402閲覧

Ruby each_slice joinメソッドについて

kazuyakazuya

総合スコア193

Ruby

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

0グッド

0クリップ

投稿2019/08/21 08:57

前回の質問・・・
Rubyのeach_slice join mapメソッドの使い方で結構躓いています。
それらメソッドを使ったコードの中で分からないところが
あったので教えてください。

ruby

1num = "000000000000000000000000000000000000" 2p num.chars.each_slice(3).join("A") 3

これを実行するとエラーになってしまいます。

ruby

1C:\Users\u16154\Desktop\ruby_lesson>ruby sample2.rb 2sample2.rb:2:in `<main>': undefined method `join' for #<Enumerator:0x0000000002e92fa8> (NoMethodError)

cmd

1000A000A000A000A・・・

のように0が3回並んだらAが現れることを期待したのですが・・・

#自分の解釈

ruby

1p num.chars.each_slice(3).join("A")

まずcharsによって
0が配列に格納される。

ruby

1"00000000000000" 23["0","0","0","0","0"・・・]

次に

ruby

1each_slice(3)

これによって
配列の要素が3つずつ区切られる。

ruby

1[["0","0","0"],["0","0","0"],["0","0","0"]・・・]

そして最後joinによって

ruby

1[["0","0","0"],["0","0","0"],["0","0","0"]・・・].join("A")

なにが原因なのでしょうか?
配列の中に配列があること自体には問題ないはず

分からないので参考になるリンクまたは説明をお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

rb

1num = "000000000000000000000000000000000000" 2num.chars 3#=> ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"] 4num.chars.each_slice(3) 5#=> #<Enumerator: ["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"]:each_slice(3)> 6num.chars.each_slice(3).join("A") 7#=> NoMethodError (undefined method `join' for #<Enumerator:0x00007fa8438ed530>) 8num.chars.each_slice(3) { |x| x.join } 9#=> nil 10num.chars.each_slice(3) { |x| x.join }.join('A') 11#=> NoMethodError (undefined method `join' for nil:NilClass) 12num.chars.each_slice(3).map(&:itself) 13#=> => [["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"], ["0", "0", "0"]] 14num.chars.each_slice(3).map(&:join).join('A') 15#=> "000A000A000A000A000A000A000A000A000A000A000A000"

発生しているエラーはエラー文の通りです。
mapeachの違いは戻り値の違いです。

rb

1[1,2,3].map(&1.method(:+)) 2#=> [2, 3, 4] 3[1,2,3].each(&1.method(:+)) 4#=> [1, 2, 3]

投稿2019/08/21 09:10

編集2019/08/21 09:16
Mugheart

総合スコア2344

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

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

kazuyakazuya

2019/08/21 09:26

ありがとうございます。 つまり、joinを使いたければ Enumeratorクラスを返すmapを joinを使う前に 呼び出す必要があるということですか?
Mugheart

2019/08/21 09:42

いいえ、joinを使いたければレシーバをjoinが使える形にする必要があるということです。 > Enumeratorクラスを返すmapをjoinを使う前に呼び出す その場合はエラーになります。 ['A','B','C'].map.join #=> NoMethodError (undefined method `join' for #<Enumerator: ["A", "B", "C"]:map>)
kazuyakazuya

2019/08/21 10:02

https://qiita.com/4geru/items/a773f9362fb90e0e0b4f mapとeachは実行後の返り値が異なります。mapはブロック文内の返り値、eachはブロックの引数を返します。 ・・・と書かれているのですが いまいちピンと来ません・・・ p num.chars.each_slice(3) =>#<Enumerator: #<Enumerator: ["0", "0", "0"・・・ p num.chars.each_slice(3).map(&:join) =>["000", "000", 両者の違いといったら NoMethodError が出るか出ないか・・・
kazuyakazuya

2019/08/21 10:19

理解できました。大丈夫です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問