Nano Hash - криптовалюты, майнинг, программирование

Функция PowerShell изменяет содержимое аргумента массива

Некоторая предыстория: когда пустой конвейер назначается переменной, значение равно [System.Management.Automation.Internal.AutomationNull]::Value, как описано здесь https://stackoverflow.com/a/22365076/37572

AutomationNull обладает некоторыми интересными свойствами.

  • AutomationNull -eq $null
  • AutomationNull -is [psobject]
  • если AutomationNull передается в функцию ($x), то значение аргумента $x является простым $null

Код ниже присваивает AutomationNull члену массива, а затем вызывает функцию f($x) с массивом в качестве аргумента. Удивительным результатом является то, что член массива, который раньше содержал AutomationNull, теперь содержит простой $null.

"PSVersion "+ $PSVersionTable.PSVersion

Write-Host -ForegroundColor Yellow "******** array initialized"
$array = @(0,$null,2)

for($i=0; $i -lt $array.Count; $i++) {
    if ($null -eq $array[$i]) {
        if ($array[$i] -is [psobject]) {"array[$i] is null and [psobject]"
        } else {"array[$i] is null"}
    } else {"array[$i] is " + $array[$i]}
}

Write-Host -ForegroundColor Yellow "******** array[1] set to empty pipeline"
$emptypipe = (@()|%{1})
$array[1] = $emptypipe

for($i=0; $i -lt $array.Count; $i++) {
    if ($null -eq $array[$i]) {
        if ($array[$i] -is [psobject]) {"array[$i] is null and [psobject]"
        } else {"array[$i] is null"}
    } else {"array[$i] is " + $array[$i]}
}


function f($x) {Write-Host -ForegroundColor Yellow '******** called: f -x $array'}
f -x $array

for($i=0; $i -lt $array.Count; $i++) {
    if ($null -eq $array[$i]) {
        if ($array[$i] -is [psobject]) {"array[$i] is null and [psobject]"
        } else {"array[$i] is null"}
    } else {"array[$i] is " + $array[$i]}
}

Полученные результаты:

PSVersion 3.0
******** array initialized
array[0] is 0
array[1] is null
array[2] is 2
******** array[1] set to empty pipeline
array[0] is 0
array[1] is null and [psobject]
array[2] is 2
******** called: f -x $array
array[0] is 0
array[1] is null
array[2] is 2

Таким образом, кажется, что простой вызов f($x) с массивом в качестве аргумента изменил содержимое массива.

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

Кто-нибудь может объяснить такое поведение?

P.S. Извините, что приведенный выше код должен дословно повторять цикл for три раза, но превращение его в функцию скрывает фактический результат теста.


  • Отличная находка; в стороне: самый простой способ создать нулевую коллекцию ([System.Management.Automation.Internal.AutomationNull]::Value]) — использовать $nullc = & {}. 23.01.2018
  • Так как это воспроизведение в PS Core v6.0.0, я рекомендую вам сообщить о проблеме на github.com/PowerShell/ PowerShell/проблемы 23.01.2018
  • Все в вашем вопросе имеет смысл, кроме... части вопроса. Учитывая описанные вами условия и размещенный вами код, мы видим ожидаемое поведение. Можете ли вы немного пояснить часть неверных предположений? 23.01.2018
  • @MathiasR.Jessen: неожиданное поведение заключается в том, что простой акт передачи массива в качестве аргумента функции незаметно изменяет элемент этого массива с [System.Management.Automation.Internal.AutomationNull]::Val‌​ue на $null 23.01.2018
  • @MathiasR.Jessen Просто чтобы уточнить, я знаю, что в моем вступлении говорится, что AutomationNull, переданный функции, автоматически преобразуется в простой $ null. Это понятно и ожидаемо. Что неожиданно, так это то, что содержимое массива постоянно изменяется (в области действия вызывающей стороны) просто путем передачи массива в функцию. 23.01.2018
  • @mklement0 Спасибо. Я поднял вопрос на github.com/PowerShell/PowerShell/issues/5987. 23.01.2018
  • Благодарю за разъяснение. Почти уверен, что это также происходит с элементом массива во время привязки параметров, нужно будет копаться в источнике, чтобы проверить, хотя 23.01.2018

Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..