ruby
1each_sliceメソッド
を使った回答がついたのですが、
このeach_sliceの使い方(省略形)について
分からないところがあったのでお願いします。
string
1指定した数値にしたがって分割できる
とあります。
そしてさらに省略形にもできるみたいですが
ruby
1text = "0123456789" 2#配列に格納します。 3a = text.chars 4p a #=>["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 5 6#省略形 7p a.each_slice(2)# =>#<Enumerator: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]:each_slice(2)> 8 9a.each_slice(2) do |v| 10 p v # => 11["0", "1"] 12["2", "3"] 13["4", "5"] ←実行結果 14["6", "7"] 15["8", "9"] 16end
これは省略形というより全く別物ですよね?
ruby
1ブロックを省略するとEnumeratorオブジェクトを返します。
うまく言い表せないのですが
つまり、each_sliceの省略形はどのように使えばいいのでしょうか?
分からないので参考になるリンクまたは説明をお願いします。
追記
ruby
1text = "0123456789" 2a = text.chars 3p a.each_slice(2).map(&:join) 4 5a.each_slice(2) do |v| 6 v.map{ |i| 7 i.join 8 } 9end
やっていることは同じだとおもうのですが
下のほうのコードではエラーになってしまいます。
なんでなんでしょうか?
追記
ruby
1text = "0123456789" 2a = text.chars 3 4a.each_slice(2).map do |v| 5 p v.join 6end
↓
cmd
1"01" 2"23" 3"45" 4"67" 5"89"
ruby
1text = "0123456789" 2a = text.chars 3 4a.each_slice(2) do |v| 5 p v 6end 7
実行結果
cmd
1["0", "1"] 2["2", "3"] 3["4", "5"] 4["6", "7"] 5["8", "9"]
ならば
ruby
1text = "0123456789" 2a = text.chars 3 4a.each_slice(2) do |v| 5 p v.map(&:join) 6end
このコードは
ruby
1p ["0", "1"].join 2p ["2", "3"].join 3p ["4", "5"].join 4p ["6", "7"].join 5p ["8", "9"].join
となると思うのですがどこらへんの
解釈から間違えているのでしょうか?
#質問1
ruby
1text = "0123456789" 2#配列に格納します。 3a = text.chars 4 5サンプル1 6p a.each_slice(2).map(&:join)←サンプル2と同じ処理をするはずなのにエラーにならない 7 8サンプル2 9a.each_slice(2) do |v| 10 p v.map(&:join) ←これがなぜエラーになるかはわかった 11end
回答でいただいた通り サンプル1と2ともに
ruby
1["0","1"].join 2["2","3"].join 3["4","5"].join
といったかたちになると思うのですがなぜ
サンプル1(省略形)ではエラーにならないのでしょうか?
#質問2
ruby
1a.each_slice(2) do |v| 2 p v.map(&:join) 3end
これを正しく書くと以下のようになると
ruby
1 2a.each_slice(2).map do |i| 3i.join 4end
教えてもらったのですが
この処理の解釈の仕方について合っているか教えてください。
ruby
1["0","1","2","3","4","5"・・・]
といった配列が
ruby
1each_slice
によって
ruby
1[["0","1"] ["2","3"] ["4","5"]・・・]
といった配列になる
それをmapメソッドで
配列の中の配列を取り出し
ruby
1[["0","1"] ["2","3"] ["4","5"]・・・] 2↓ 3["0","1"] ["2","3"] ["4","5"]
そしてjoinメソッドを実行する。
・・・なんか間違っているような気もするのですが
合っていますか?
#質問3(一応)
ruby
1a.each_slice(2).map do |i| 2i.join 3end
教えてもらったコードのなかの
mapメソッドはなぜ必要なのでしょうか?
ruby
1each_sliceメソッド
で
ruby
1["0","1","2","3","4"・・・]
このような配列の中から
ruby
1["0","1"]["2","3"]["4","5"]
このように指定した数だけまとめて処理できるとおもうのですが
ではmapメソッドはいらないことになってしまうんじゃないでしょうか?
ruby
1a.each_slice(2).map do |i| 2i.join 3end
↓
ruby
1a.each_slice(2) do |i| 2i.join 3end
↓
ruby
1["0","1"].join 2["2","3"].join 3["4","5"].join
わからないのでお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/20 15:02
2019/08/21 00:40
2019/08/21 00:47