最初は、次のようなことをするつもりでした。
arr = [[1,2],[3,4]]
new_arr =
arr.map do |sub_arr|
sub_arr.map do |x|
x+1
end
end
p new_arr
出力:
[[2,3],[4,5]]
しかし、それから私は列挙子を「連鎖」させることによってそれを短くしようとしました:
arr.map.map{|x| x+1}
その後、エラーが発生しますto_ary method missing
私はそれをデバッグしました
arr.each.each{|x| p x}
出力:
[1,2]
[3,4]
、これは元の配列であり、一度だけ検出されます。
2つのマップ/各列挙子をチェーンして、列挙子を2つ(またはそれ以上)のレベルにするにはどうすればよいですか?またはそれはブロック内にある必要がありますか?
アップデート:
いくつかの検索の後、チェーンobj.Enumerator.Enumerator.Enumerator...
はobjを1回だけ列挙し、1レベルの深さしか列挙しないようです。さらに深く進むには、ブロックが必要です。文字列をブロックに変換する単純なコード(Proc / Lambda;シンボルからブロックに似ていますが、より多くの使用法;より機能的な構文に似ています)を作成して、ブロックが回避されるようにしました。誰かが似たようなコードを持っていますString#to_proc
が、私はそれを見つけることができませんでした、そしてその中のx,y
ものは私の好みにアピールしません。私が使う$0,$1,$2,...
サンプルコード(前の例は次のように記述されます):
arr = [[1,2],[3,4]]
new_arr = arr.map(&'[$0+1,$1+1]')
p new_arr
後で元のコードをgithubにプッシュします。私が本当に先延ばしにしているので、その前にそれを見たい場合は、チャットを使用して私に連絡することができます:)