метод и назначение массива powershell clear - PullRequest
0 голосов
/ 09 февраля 2019

Оператор присваивания = «Устанавливает значение переменной в указанное значение», как указано в справочном документе .Не удивительно, что изменения в переменной (в моем случае массив), которая была ранее назначена другой переменной, не влияют на значение этой последней.

    PS C:\> $V="a", "b", "c"
    PS C:\> $A=$V
    PS C:\> write-host "A before new value of V: $A"
    A before new value of V: a b c
    PS C:\> $V="e","f"
    PS C:\> write-host "A after new value of V: $A"
    A after new value of V: a b c
    PS C:\>  

Но когда используется метод clear (), поведение кажется другим.

PS C:\> $V="a", "b", "c"
PS C:\> $A=$V
PS C:\> write-host "A before clearing V: $A"
A before clearing V: a b c
PS C:\> $V.clear()
PS C:\> write-host "A after clearing V: $A"
A after clearing V: 
PS C:\>  

Кажется, что метод clear (), применяемый к $ V, действует и на $ A.Как будто назначение было по ссылке, как ни странно, только для этого метода.Фактически, если новое значение назначено $ V после его очистки, на $ A все еще влияет только очистка.

PS C:\> $V="a", "b", "c"
PS C:\> $A=$V
PS C:\> write-host "A before clearing V: $A"
A before clearing V: a b c
PS C:\> $V.clear()
PS C:\> $V="e","f"
PS C:\> write-host "A after clearing V: $A"
A after clearing V:   
PS C:\>  

Существуют возможности избежать этого эффекта, хотя и не совсем идентичные: $ A = $ V.clone () или использование командлета Clear-Variable -name V или $ V = $ null вместо $ V.clear () или, возможно, другие лучше, чем те, которые кто-то может предложить.

Но мой вопрос:
как объяснить "распространение" эффекта метода clear на $ V на другой массив $ A?

Были проведены тесты на PS ver.5.1.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Используйте метод Clone() для получения true копии массива.

$V = "a", "b", "c"
$A = $V.Clone()
Write-Host "A before new value of V: $A"
$V = "e","f"
Write-Host "A after  new value of V: $A"
A before new value of V: a b c
A after  new value of V: a b c

Для объяснения прочитайте Копирование массивов иХеш-таблицы :

Копирование массивов или хеш-таблиц из одной переменной в другую работает, , но может привести к неожиданным результатам .Причина в том, что массивы и хеш-таблицы не хранятся непосредственно в переменных, которые всегда хранят только одно значение.Когда вы работаете с массивами и хеш-таблицами, вы имеете дело с ссылкой на массив или хеш-таблицу.Таким образом, если вы скопируете содержимое одной переменной в другую, будет скопирована только ссылка, а не массив или хеш-таблица.Это может привести к следующему неожиданному поведению:

$array1 = 1,2,3
$array2 = $array1
$array2[0] = 99
$array1[0]
99

Хотя содержимое $array2 было изменено в этом примере, это также влияет на $array1, поскольку они оба идентичны ,Переменные $array1 и $array2 внутри ссылаются на одну и ту же область хранения .Поэтому вам необходимо создать копию, если вы хотите скопировать массивы или хеш-таблицы:

$array1 = 1,2,3
$array2 = $array1.Clone()
$array2[0] = 99
$array1[0]
1

Всякий раз, когда вы добавляете новые элементы в массив (или хеш-таблицу) или удаляете существующие, действие копированияпроисходит автоматически в фоновом режиме, а его результаты сохраняются в новом массиве или хэш-таблице.Следующий пример ясно показывает последствия:

# Create array and store pointer to array in $array2:
$array1 = 1,2,3
$array2 = $array1

# Assign a new element to $array2. A new array is created in the process and stored in $array2:
$array2 += 4
$array2[0]=99

# $array1 continues to point to the old array:
$array1[0]
1

Кстати, вы можете встретить термины Тип значения , Тип ссылки и Тип указателя чаще ...

0 голосов
/ 09 февраля 2019

Для меня то, что вы видите, нормально, я пытаюсь объяснить себе:

$V="a", "b", "c"
$a = $V

теперь $a содержит ту же ссылку, что и $V.если вы очищаете $V, тогда $a очищается.

теперь, если вы пишете $V = "b","c", вы воздействуете на $V со ссылкой на новую вкладку.и эта ссылка не то же самое, что вы затрагиваете $a.так что теперь, если вы очистите $V, $a не будет очищено.

Достаточно ли ясно?

...