прицелов | PowerShell на примере
областей | PowerShell By ExamplePowerShell By ExampleКогда вы создаете переменную, псевдоним или функцию в PowerShell, они доступны только в текущей области, в которой они были созданы. Например, когда вы создаете переменную в функции, она доступна только в этой функции. Когда вы создаете переменную в скрипте, она доступна в скрипте и во всех функциях скрипта.
Есть способ сделать эти элементы доступными за пределами текущей области.
Локальная
Локальная область действия зависит от контекста, в котором выполняется код в данный момент.
Чтобы определить локальный элемент, используйте модификатор local: . По умолчанию областью действия переменной является область Local .
$вар = "бла" $вар
Результат:
бла
Global
Элементы глобальной области доступны везде.
Чтобы определить элемент как глобальный, используйте модификатор global: .
$global:varOne = "bla" # Назначить переменную в глобальной области видимости Write-Host "Variable One:" $global:varOne # Напечатать переменную # Функция для демонстрации локальной и глобальной области видимости функция MyFunc() { $global:varOne = "бла-бла" $varTwo = "бу" вернуть $varTwo } Write-Host "Variable Two:" $varTwo # Напечатать переменную $varTwo = MyFunc # Вызвать функцию и изменить переменную Write-Host "Variable One:" $varOne # Напечатать переменную Write-Host "Variable Two:" $varTwo # Напечатать переменную
Результат:
Первая переменная: bla Вторая переменная: Переменная первая: бла-бла Вторая переменная: бу
Как видите, мы определили глобальную переменную с именем varOne и изменили значение varOne в функции. У нас не было доступа к переменной varTwo , потому что область действия переменной была установлена в функции как локальная.
Private
Элементы, которые определены как частные, недоступны за пределами области, в которой они определены.
Чтобы сделать элемент закрытым, используйте модификатор private: .
# Убедитесь, что переменная пропала Remove-Variable -Name var1 -ErrorAction SilentlyContinue $var1 = "Это переменная" Запись-хост "var1 = '$var1'" функция test1 { Write-Host "Внутри функции, var1 = $var1" } тест1 # Теперь давайте сделаем это в частном порядке Remove-Variable -Name var1 -ErrorAction SilentlyContinue $Private:var1 = "Это переменная" функция test2 { Write-Host "Внутренняя функция с приватным, var1 = $var1" } тест2
Результат
var1 = 'Это переменная' Внутри функции, var1 = это переменная Внутренняя функция с закрытым, var1 =
Как видите, функция test2 не имела доступа к переменной
Сценарий
Область сценария создается автоматически при каждом запуске сценария PowerShell.
Для определения скрипта элемента используется модификатор script:.
функция myFunc { $Script:VarOne = "Ограничено сценарием" $Var2 = "Функция ограничена" } моя функция Ведущий записи "Var 1: $VarOne" Ведущий записи "Var 2: $Var2"
Результат:
Var 1: Script Scoped Вар 2:
Как видите, скрипт не может получить доступ к переменным $Var2
, но может получить доступ к переменной $VarOne
.
C311 Имя, Область, Привязка
C311 Имя, Область, Привязка Дана ВраджиторуЯзыки программирования C311
Имя
- Имя — строка символов, используемая для представления чего-либо еще. Обычно это идентификаторы, но операторы (+, &, *) также имена.
- Они позволяют нам ссылаться на объекты в программе с помощью символа вместо этого адреса.
- Они обеспечивают уровень абстракции в программе: классы для данных
абстракция, функции управления абстракцией.
- Они позволяют нам лучше сосредоточиться на некоторых аспектах программы, снижение концептуальной сложности кода.
Переплет
- Связывание — операция связывания двух вещей, как имя и сущность, которую оно представляет.
- Время привязки — момент выполнения привязки (компиляция, исполнение и т.д.).
- Раннее связывание — позднее связывание . Относится к привязке время.
- Статическая привязка — динамическая привязка
- Полиморфизм — разрешение имени (функции, переменной) быть привязан к более чем одному объекту.
- Псевдоним — несколько привязок для одного и того же объекта.
Раннее/позднее связывание
- Тип : раннее связывание ограничивает тип переменной. Поздно привязка позволяет решить это, когда присваивается значение.
- Функция : функция известна во время компиляции или оставлена
сопоставляется, когда вызов выполняется.
- Значение : поздняя привязка ожидает, пока значение/данные, назначенные переменная необходима перед ее оценкой или загрузкой.
Динамическое связывание
- Точное значение каждого идентификатора (переменной/функции) определяется, когда инструкция выполняется на основе контекста.
- Пример на Лиспе: функция A ссылается на «глобальную» переменную Икс.
- Функция B объявляет локальную переменную x и затем вызывает функцию A.
- В этом вызове функции x является локальной переменной из B.
Время связывания
- Дизайн языка — основные аспекты языка, встроенные функции, ключевые слова.
- Реализация языка — такие детали, как размер каждого тип, представление файла, исключения времени выполнения.
- Программирование — алгоритмы, проектирование структур данных.
- Компиляция — отображение между конструкциями более высокого уровня и
машинный код, статические данные.
- Связывание — между вызовами функций и внешними объектами и их фактический код.
- Загрузить — виртуальные адреса, динамические библиотеки.
- Runtime — виртуальные функции, значения переменных и многое другое.
Срок службы объекта
- Объект — любая сущность в программе. Переменные, функции.
- Время жизни объекта — период между созданием объекта и разрушение.
- Срок службы привязки — период между созданием и разрушение привязки.
- Обычно время жизни привязки является подмножеством времени жизни объекта.
- Висячая ссылка — когда привязка существует после
разрушение объекта.
Пример: удаление указателя, но не превращение его в NULL. - Утечка памяти — когда объект все еще существует, но его нет привязка к нему. Пример: сделать указатель NULL, не удаляя его первый. Решается сборкой мусора.
Распределение объектов
- Статические объекты — они имеют абсолютный адрес, который существует для
продолжительность программы.
- Глобальные переменные, статические локальные переменные, рабочие таблицы, функциональное пространство для языков, не поддерживающих рекурсию, константы.
- Стек объектов — последний пришел, первый ушел (LIFO). Функциональное пространство для языков, поддерживающих рекурсию,
- Куча объектов — могут быть выделены и освобождены в произвольное время. Динамически выделяемые части связанных данных структуры, объекты с динамически изменяемым размером.
Функциональное пространство
- Стек вызовов функций содержит кадр для каждой функции.
- Одна рама содержит:
- аргументы, возвращаемые значения
- локальные переменные, константы времени разработки
- временные: промежуточные значения, полученные в сложных вычислениях
- бухгалтерская информация: обратный адрес, ссылка на вызывающего кадр, отладочная информация.
Управление кучей
- Обычно есть связанный список — свободный список — всей памяти
блоки не используются.
- При запросе на выделение программа ищет в куче за свободный блок как минимум запрошенного размера.
- First fit — возврат первого блока, соответствующего запросу.
- Наилучшее соответствие — возврат наименьшего блока, соответствующего запросу.
- Наихудший вариант — самый большой блок, чтобы избежать фрагментации памяти
- Пул — разделение списка на подсписки по размеру.
- Компактный — перемещение распределяющих куч ближе друг к другу создавать большие свободные блоки. При перемещении объекта необходимо обновить все ссылки на него.
Область применения и правила
- Область привязки — текстовая область программы в какая привязка активна.
- Scope — иногда область программы максимального размера в который без привязки изменяет область действия.
- Среда ссылок — набор активных привязок в любой
данный момент выполнения программы.
- Объем привязок определяется правилами привязок, включенными в описание языка.
Объем привязки
- Обычно область привязки определяется статически, т.е. во время компиляции.
- Когда вызывается функция с локальной переменной, привязка между именем переменной и экземпляром переменной, локальной для вызов создан.
- Все предыдущие привязки для того же имени переменной деактивированы в процессе (или скрыто).
- Когда вызов функции завершается, предыдущая привязка для имени восстановлен.
Статические прицелы
- Статическая область — когда область привязки определяется во время компиляция.
- Иногда называется лексической областью действия.
- Текущая привязка — соответствующее объявление, блок которого больше всего близко окружает точку в программе, где имя упомянул.
- Глобальная область действия — некоторые языки поддерживают только глобальные переменные (Базовый)
- Локальная статическая область — для языков, не поддерживающих рекурсию
а для статических переменных в другом.
Вложенные объявления
(пусть ((А 1)) (пусть ((А 2) (В А)) В)
- В Лиспе переменные в let объявляются параллельно. в приведенное выше выражение B равно 1.
- Обычно во вложенном объявлении невозможно получить доступ к значение предыдущей привязки.
- Исключение: эквиваленты памяти как в Фортране, множественные ссылки на одни и те же объекты.
- Для классов можно указать область вызова функции (оператор :: в C++).
Динамический прицел
- Привязки, определенные во время выполнения. Они зависят от порядка в какие функции вызываются.
- Текущая привязка — та, которая встречалась последней во время казни и который еще не уничтожен.
- Проверка типов для динамической области видимости выполняется во время выполнения.
Динамическая область видимости — Lisp
(переменная по умолчанию 3) ; y является глобальным (определ. f (x) (+ х у)) ; мы думаем, что f использует глобальный y (f 10) ; => 13 (дефун г () (пусть ((у 4) (а 1)) (ф а))) (г) ; => 5 ; подумай еще раз
Область применения
- Статическая область действия зависит от таблицы символов, которая представляет собой карту или
словарь.