2016-06-09 3 views
2

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

$a = @(@('a','b'), 
     @('c','d')) 

$b = @(@('a','b') 
     , @('c','d')) 

В этом случае $a.length принимает значение 2, а $b.length принимает значение 3. Первого суб-массив $b был сплющен.

Является ли это функцией и где я могу найти ее документацию?

Кстати, $PSVersionTable:

Name       Value 
----       ----- 
PSVersion      4.0 
WSManStackVersion    3.0 
SerializationVersion   1.1.0.1 
CLRVersion      4.0.30319.42000 
BuildVersion     6.3.9600.16406 
PSCompatibleVersions   {1.0, 2.0, 3.0, 4.0} 
PSRemotingProtocolVersion  2.2 

ответ

2
, Comma operator 
     As a binary operator, the comma creates an array. As a unary 
     operator, the comma creates an array with one member. Place the 
     comma before the member. 

Source.

Его, потому что @('a','b') будет толкать две строки a и b в массив $b тогда вы вынуждаете @('c','d'), чтобы получить толкнул в $b как array используя запятую.

Пример:

$b = @(@('a','b') 
     , @('c','d')) 

$b | foreach { Write-Host "Item: $_"} 

Выход:

Item: a 
Item: b 
Item: c d 

И если вы посмотрите на типы:

$b | foreach { $_.GetType()} 

Вы получаете:

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

Чтобы заставить $b содержать два arrays, используйте запятую бинарный оператор:

$b = @(@('a','b'),@('c','d')) 
+0

Я извиняюсь, я не понимаю вашего ответа. '$ b = @ (@ ('a', 'b'), @ ('c', 'd'))' содержит два массива без запятой. В чем разница, когда я вставляю новую строку перед запятой и ПОСЛЕ запятой? – Benoit

+0

Вы правы. Потому что в этом случае 'comma' используется как двоичный оператор, см. Мое редактирование. –

+0

Означает ли это, что бинарные операторы не могут следовать за новой строкой? – Benoit

Смежные вопросы