class_copyPropertyList не работает в Swift 5. В чем причина?

Спустя много лет после того, как вопрос был задан первым, позвольте мне кратко изложить положение дел с PowerShell v5.1:

  • Bash's / cmd 's && и || операторы управления не имеют эквивалентов PowerShell, и поскольку вы не можете определить пользовательские операторы в PowerShell, нет хороших обходных путей: используйте отдельные команды (в отдельных строках или разделенные с ;) и явно проверяйте состояние успеха каждой команды с помощью автоматической переменной $?, например: command1 -arg1 -arg2; if ($?) { command2 -arg1 } # equivalent of && command1 -arg1 -arg2; if (-not $?) { command2 -arg1 } # equivalent of || Ниже приведено описание причин, по которым PowerShell -and и -or обычно являются не решением.
  • Был разговор о добавлении их назад, но, похоже, он никогда не делал вершину списка. Теперь, когда PowerShell вышел с открытым исходным кодом, проблема с g1 была открыта в GitHub . Токены && и || в настоящее время зарезервированы для будущего использования в PowerShell, поэтому есть надежда, что может быть реализован тот же синтаксис, что и в Bash. (Начиная с PSv5.1, попытка чего-то вроде 1 && 1 дает сообщение об ошибке The token '&&' is not a valid statement separator in this version.)

Почему PowerShell -and и -or не могут заменить && и ||:

Операторы управления Bash && (закорачивающие логические И) и || (короткое замыкание логического ИЛИ) неявно проверяют статус успеха команд по их кодам выхода, , не мешая их выходным потокам ; например:

ls / nosuchfile && echo 'ok'

Независимо от того, какие ls выходы - оба выхода stdout (файлы в /) и вывод stderr (сообщение об ошибке от попытки доступа к несуществующему файлу nosuchfile) - - передается через , но && проверяет код [невидимого] выхода команды ls, чтобы решить, является ли команда echo - RHS &&.

ls сообщает код выхода 1 в этом случае, сообщение об ошибке - поскольку файл nosuchfile не существует - - поэтому && решает, что ls не удалось , и, применяя короткое замыкание, решает, что команда echo не должна выполняться. Обратите внимание, что это код выхода 0, который сигнализирует успех в мире cmd.exe и bash, тогда как любой код выхода ненулевой указывает на сбой.

Другими словами: && и || Bash полностью работают независимо от выхода команд и действуют только на статус успеха команд.


PowerShell -and и -or, напротив, действуют только на выход стандартных команд [success] , потребляют , а затем выводят только логический результат операция; например:

(Get-ChildItem \, nosuchfile) -and 'ok'

Выше:

  • использует и потребляет выход success (стандартный) список \ - и интерпретирует его как Boolean ; непустая входная коллекция считается $true в булевом контексте, поэтому, если есть хотя бы одна запись, выражение оценивается как $true. Однако информация об ошибке , полученная из несуществующего файла nosuchfile , проходит через , поскольку ошибки отправляются в отдельный поток.
  • Учитывая, что Get-ChildItem \, nosuchfile возвращает непустой результат успеха, LHS оценивается как $true, поэтому -and также оценивает RHS, 'ok', но опять же потребляет его вывод и интерпретирует его как логическое значение, которое как непустая строка также оценивается как $true.
  • Таким образом, общий результат выражения -and равен $true, который равен (единственный успех) output .

Сетевой эффект:

  • Выход успеха с обеих сторон -and выражение потребляется во время оценки и, следовательно, эффективно hidden .
  • Вывод выражения (успех) выражения - это его логический результат, который является $true в этот случай (который отображается как True в терминале в англоязычных системах).

0
задан Aditya Sharma 26 March 2019 в 18:50
поделиться