2016-01-19 1 views
7

Warum bekomme ich diese Art von Datenstruktur, wenn ich Arrays auf ein Array von Arrays, die ein Array als einziges Element hat drücken ?Perl6: Pushing ein Array zu einem Array von Arrays mit einem Element scheint nicht wie erwartet funktioniert

use v6; 

my @d = ([ 1 .. 3 ]); 
@d.push([ 4 .. 6 ]); 
@d.push([ 7 .. 9 ]); 


for @d -> $r { 
    say "$r[]"; 
} 
# 1 
# 2 
# 3 
# 4 5 6 
# 7 8 9 

say @d.perl; 
# [1, 2, 3, [4, 5, 6], [7, 8, 9]] 
+1

'push' fügt eine Sache bis zum Ende der Liste, verwenden Sie' append' wenn Sie möchten, um mehr als ein Element gleichzeitig zu übergeben. –

Antwort

8

Dies ist das erwartete Verhalten in der The single argument rule beschrieben.

Perl 6 hat eine Reihe von Modellen durchlaufen, die sich auf die Abflachung während seiner Entwicklung beziehen, bevor sie sich auf eine einfache, als "Einzelargument-Regel" bekannte Weise festlegen.

Die Einzelargument-Regel wird am besten verstanden, wenn man die Anzahl der Iterationen berücksichtigt, die eine for-Schleife benötigt. Die zu iterierende Sache wird immer als ein einziges Argument für die for-Schleife behandelt, also der Name der Regel.

for 1, 2, 3 { }   # List of 3 things; 3 iterations 
for (1, 2, 3) { }  # List of 3 things; 3 iterations 
for [1, 2, 3] { }  # Array of 3 things (put in Scalars); 3 iterations 
for @a, @b { }   # List of 2 things; 2 iterations 
for (@a,) { }   # List of 1 thing; 1 iteration 
for (@a) { }   # List of @a.elems things; @a.elems iterations 
for @a { }    # List of @a.elems things; @a.elems iterations 

... die Liste Konstruktor (die Infix: <, Operator>) und dem Array Komponist (die [...] Zirkumfix) folgen der Regel:

[1, 2, 3]    # Array of 3 elements 
[@a, @b]    # Array of 2 elements 
[@a, 1..10]    # Array of 2 elements 
[@a]     # Array with the elements of @a copied into it 
[1..10]     # Array with 10 elements 
[[email protected]]     # Array with 1 element (@a) 
[@a,]     # Array with 1 element (@a) 
[[1]]     # Same as [1] 
[[1],]     # Array with a single element that is [1] 
[$[1]]     # Array with a single element that is [1] 

Die einzige von denen, die wahrscheinlich eine Überraschung bieten wird, ist [[1]], aber es wird als ausreichend selten angesehen, dass es keine Ausnahme von der sehr allgemeinen Einzelargument-Regel garantiert.

Also diese Arbeit machen ich schreiben kann:

my @d = ([ 1 .. 3 ],); 
@d.push([ 4 .. 6 ]); 
@d.push([ 7 .. 9 ]); 

oder auch

my @d = ($[ 1 .. 3 ]); 
@d.push([ 4 .. 6 ]); 
@d.push([ 7 .. 9 ]); 
+0

Vielleicht allgemeiner, [Große Liste Refactor] (https://perl6advent.wordpress.com/2015/12/14/day-15-2015-the-year-of-the-great-list-refactor/) – cuonglm

Verwandte Themen