Zunächst werde ich so etwas wie unten tun:Rubin: Enumerator Ketten
arr = [[1,2],[3,4]]
new_arr =
arr.map do |sub_arr|
sub_arr.map do |x|
x+1
end
end
p new_arr
Ausgang:
[[2,3],[4,5]]
Aber dann habe ich versucht, kurz, um es von "Verkettungs up" den Aufzählungen:
arr.map.map{|x| x+1}
Dann gibt es Fehler to_ary method missing
I debuggt durch
arr.each.each{|x| p x}
Output:
[1,2]
[3,4]
, die die ursprüngliche Matrix ist und nur einmal desected.
Wie kann ich zwei Karten/jede Aufzählung verketten, so dass es Aufzählung in 2 (oder mehr) Ebenen? Oder muss es in dem Block sein?
Update:
Nach einiger Suche, anscheinend eine Kette obj.Enumerator.Enumerator.Enumerator...
aufzählt nur obj die einmal, und nur 1 Stufe Tiefe. Um tiefer zu gehen, ist eine Blockierung erforderlich. Ich arbeitete einfachen Code aus, der String in Block umwandelte (Proc/Lambda; ähnlich wie das zu blockierende, aber mehr Gebrauch; mehr wie eine funktionale Syntax), so dass Block vermieden wird. Jemand hat ähnlichen Code String#to_proc
, aber ich konnte es nicht finden, und die x,y
Sache darin appelliert nicht zu meinem Geschmack. Ich benutze $0,$1,$2,...
Beispielcode (das vorherige Beispiel wird wie geschrieben):
arr = [[1,2],[3,4]]
new_arr = arr.map(&'[$0+1,$1+1]')
p new_arr
Ich werde den ursprünglichen Code schieben später GitHub. Sie können Chat verwenden, um mich zu kontaktieren, wenn Sie es vorher sehen möchten, weil ich wirklich zögern :)