Область значений функции с модулем : Чулан (М)
mosya12345 |
| ||
07/01/11 |
| ||
| |||
Praded |
| |||
21/05/11 |
| |||
| ||||
Профессор Снэйп |
| |||
18/12/07 |
| |||
| ||||
Показать сообщения за: Все сообщения1 день7 дней2 недели1 месяц3 месяца6 месяцев1 год Поле сортировки АвторВремя размещенияЗаголовокпо возрастаниюпо убыванию |
Страница 1 из 1 | [ Сообщений: 3 ] |
Модераторы: Модераторы Математики, Супермодераторы
Понимание области и видимости (VBA)
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
- Чтение занимает 2 мин
Область действия определяет, может ли переменная, константа или процедура использоваться в другой процедуре. Существует три уровня scoping: уровень процедуры, частный модуль-уровень и общедоступный модуль-уровень.
Область действия переменной определяется при ее объявлении. Лучше всего объявить все переменные в явном виде, чтобы избежать возможных конфликтов именования для переменных с разной областью действия.
Область на уровне процедур
Переменная или константа, определенные в процедуре, не видны за ее пределами. С переменной может работать только процедура, которая содержит объявление этой переменной. Далее показан пример, в котором первая процедура отображает окно сообщения, содержащее текст. Во второй процедуре отображается пустое поле сообщений, так как переменная является локальной для первой процедуры.
Sub LocalVariable() Dim strMsg As String strMsg = "This variable can't be used outside this procedure." MsgBox strMsg End Sub Sub OutsideScope() MsgBox strMsg End Sub
Область уровня частных модулей
Переменные и константы на уровне модулей можно определить в разделе Объявления модуля. Переменные уровня модуля могут быть общедоступными или закрытыми. Общедоступные переменные доступны для всех процедур во всех модулях проекта; Частные переменные доступны только процедурам в этом модуле. По умолчанию переменные, объявленные с помощью параметра
В следующем примере переменная строки strMsg
доступна для всех процедур, определенных в модуле. Когда называется вторая процедура, она отображает содержимое переменной строки strMsg
в диалоговом окне.
' Add following to Declarations section of module. Private strMsg As String Sub InitializePrivateVariable() strMsg = "This variable can't be used outside this module." End Sub Sub UsePrivateVariable() MsgBox strMsg End Sub
Примечание
Процедуры Public в стандартном модуле или модуле класса доступны в любом ссылающемся проекте. Чтобы ограничить область всех процедур в модуле текущим проектом, добавьте в раздел «Объявления» модуля заявление Option Private Module. Переменные и процедуры, объявленные как Public, будут доступны для использования в других процедурах текущего проекта, но не в ссылающихся проектах.
Область общедоступных модулей
Если переменная уровня модуля объявлена как общая (Public), то она доступна для всех процедур в проекте. В следующем примере переменная строки может использоваться любой процедурой в любом модуле проекта.
' Include in Declarations section of module. Public strMsg As String
По умолчанию все процедуры являются общими; исключение составляют процедуры событий. Когда Visual Basic создается процедура события, перед объявлением процедуры автоматически вставляется ключевое слово Private. Для всех остальных процедур необходимо явно объявить процедуру с ключевым словом Private , если вы не хотите, чтобы она была публичной.
Используйте общедоступные процедуры, переменные и константы, определенные в стандартных модулях или классах из проектов ссылок. Для этого необходимо сначала задать ссылку на проект, в котором они объявлены.
Общедоступные процедуры, переменные и константы, определенные в других стандартных или классовых модулях, таких как модули форм или модули отчетов, недоступны для проектов ссылок, так как эти модули являются закрытыми для проекта, в котором они находятся.
См. также
- Справочник по Visual Basic
- Темы по основам Visual Basic
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
javascript — Как называется область модуля? Как обратиться к этой сфере?
Задать вопрос
спросил
Изменено 1 год, 2 месяца назад
Просмотрено 232 раза
У нас есть глобальный объект в javascript, на который мы можем ссылаться, используя окно
для доступа к любой глобальной переменной. Но как обратиться к объекту области модуля, где хранятся все переменные в этом модуле?
На самом деле мне нужно сослаться на импортированный объект в модуле с помощью строки. Если бы это была глобальная переменная, я мог бы просто сделать это,
let object_I_want = window[string];
Но для модуля я не могу найти ссылку на такой объект. Я также пытался использовать this
,
var scope = this; какая-то функция () { пусть object_I_want = область [строка]; }
Но, этот
не определен внутри контекста модуля в соответствии со спецификацией. Есть ли способ сослаться на объект области/модуля модуля, например window
.
- javascript
- es6-модули
3
Я думаю, что другой способ сформулировать ваш вопрос мог бы быть: «Как я могу получить доступ к переменным с областью действия, используя строки?», и ответ: «Это невозможно в JavaScript».
Если вам действительно нужна такая динамическая гибкость с вашими значениями, вы должны назначить их все объекту верхнего уровня (и вы должны экспортировать этот объект из своего модуля, если хотите получить доступ к нему и его значениям вне модуля). Или используйте eval
, если поддерживается вашей средой.
1
Для модулей такого объекта нет. Область модуля похожа на область функции — запись среды, к которой вы не можете получить доступ из javascript, вы можете использовать ее только для объявления переменных.
Существует объект, который содержит все export
ed имена модуля (которые вы можете получить, выполнив пространство имен import * as … from …
), но это не то, что вам нужно.
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
pytest + django выдает ошибку базы данных, когда областью фиксации является «модуль»
У меня есть следующее внутри conftest. py
@pytest.mark.django_db @pytest.fixture (область = 'модуль') определить вещь(): print('sleeping') # представляет очень дорогую функцию, которую я хочу использовать только один раз для каждого модуля Thing.objects.create(thing='привет') Thing.objects.create(thing='привет') Thing.objects.create(thing='привет')
Внутри tests.py
@pytest.mark.django_db определение test_thing (вещь): утверждать models.Thing.objects.count() > 1 @pytest.mark.django_db определение test_thing2 (вещь): утверждать models.Thing.objects.count() > 1 @pytest.mark.django_db @pytest.mark.usefixtures('вещь') определение test_thing3(): утверждать models.Thing.objects.count() > 1
Все три теста выдают одну и ту же ошибку: RuntimeError: доступ к базе данных запрещен, используйте отметку «django_db» или фикстуры «db» или «transactional_db», чтобы включить его.
Я пробовал использовать scope='session'
/ scope='class'
/ scope='package'
/ scope='module'
— работает только `scope= «функция», которая противоречит цели того, чего я пытаюсь достичь. Я хочу иметь возможность создавать все эти элементы ОДИН РАЗ для каждого модуля, а не один раз для каждого теста.
Примечание: Я столкнулся с этой проблемой с большой базой кода и создал новый проект django с одним приложением, чтобы проверить и посмотреть, была ли проблема в существующем тестовом коде, и он также не прошел автономный тест. Протестировано как с postgres, так и с sqlite; не похоже на проблему с базой данных.
Не то чтобы это важно, но models.py
класс Вещь(models.Model): вещь = модели.CharField(max_length=100)
- Джанго
- pytest
- pytest-django
Хорошо, оказывается, это известное ограничение, и оно несколько задокументировано здесь. Если вы хотите решить эту проблему и избавиться от этой ошибки:
@pytest.mark.django_db @pytest.fixture (область = 'модуль') вещь определения (django_db_setup, django_db_blocker): del django_db_setup # Нельзя использовать с usefixtures(.