Может кто-нибудь объяснить, почему 1-й пример получает другие результаты, чем следующие 2 - PullRequest
6 голосов
/ 13 марта 2011
$b = (2,3)

$myarray1 = @(,$b,$b)

$myarray1[0].length #this will be 1
$myarray1[1].length

$myarray2 = @(
,$b
,$b
)

$myarray2[0].length #this will be 2
$myarray[1].length

$myarray3 = @(,$b
,$b
)

$myarray3[0].length #this will be 2
$myarray3[1].length

UPDATE

Я думаю, что для #powershell IRC мы это разработали. Вот еще один пример, который демонстрирует опасность разрыва с запятой в следующей строке, а не в верхней строке при перечислении нескольких элементов в массиве из нескольких строк.

$b = (1..20)

$a = @( $b, $b ,$b,
        $b, $b ,$b)

for($i=0;$i -lt $a.length;$i++)
{
  $a[$i].length
}        
"--------"
$a = @( $b, $b ,$b
       ,$b, $b ,$b)

for($i=0;$i -lt $a.length;$i++)
{
  $a[$i].length
}        

производит

20
20
20
20
20
20
--------
20
20
20
1
20
20

На самом деле, скорее, использование вложенных массивов, которые могут усложнить это, представляет собой простой массив целых чисел

$c = @( 1 , 2 , 
        3 , 4 )
for($i=0;$i -lt $c.length;$i++)
{
  $c[$i].gettype()
}        
"---------"
$c = @( 1 , 2 
       , 3 , 4 )
for($i=0;$i -lt $c.length;$i++)
{
  $c[$i].gettype()
}        

и результаты

IsPublic IsSerial Name                                     BaseType                                                                                                                    
-------- -------- ----                                     --------                                                                                                                    
True     True     Int32                                    System.ValueType                                                                                                            
True     True     Int32                                    System.ValueType                                                                                                            
True     True     Int32                                    System.ValueType                                                                                                            
True     True     Int32                                    System.ValueType                                                                                                            
---------
True     True     Int32                                    System.ValueType                                                                                                            
True     True     Int32                                    System.ValueType                                                                                                            
True     True     Object[]                                 System.Array                                                                                                                
True     True     Int32                                    System.ValueType         

Мне любопытно, как люди это объяснят. Я думаю, что я понимаю это сейчас, но не смог бы объяснить это кратко и понятно, хотя приведенный выше пример несколько идет к этой цели.

1 Ответ

3 голосов
/ 13 марта 2011

Я могу объяснить первый пример, но не второй. Унарный оператор запятой (см. http://rkeithhill.wordpress.com/2007/09/24/effective-powershell-item-8-output-cardinality-scalars-collections-and-empty-sets-oh-my/) создает массив с одним членом, поэтому ,$b создает массив, содержащий ($b); ,$b,$b создает массив, содержащий (,$b и $b).

Вторые два примера, я полагаю, создают массив с одним элементом, содержащий $b,$b. Затем одноэлементный массив сглаживается, давая только $b,$b.

Если кто-то может опубликовать ссылку, в которой подробно объясняется поведение двух последних примеров, я бы полюбил , чтобы увидеть это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...