Dim переменная, если она еще не затемнена в VBScript / Classic ASP - PullRequest
0 голосов
/ 02 июля 2018

Позвольте мне начать с того, что я ненавижу VBScript / ASP и не очень разбираюсь в этом, но я вынужден с ним работать, поэтому терпите меня, пожалуйста. : -)

У меня довольно простая страница, которую можно вызывать напрямую или виртуально, добавляя ее на другие страницы. Давайте назовем эту страницу includes.asp и скажем, что она может быть включена в main.asp .

includes.asp использует переменную, массив, который он должен наследовать от main.asp , если это возможно, но который я определю в includes.asp сам, если он вызывается напрямую.

Так что где-то на main.asp , будет что-то вроде:

Dim myVar(10)
myVar(1) = "Some content here"

Очевидный способ (для меня) затем определить переменную в includes.asp , если она не присутствует для наследования, будет выглядеть примерно так:

If IsEmpty(myVar) Then
  Dim myVar(10)
  myVar(1) = "Some content here"
End If

Но это не очень мне помогает. Я получаю сообщение об ошибке 800a0411 «Имя переопределено» в строке в включены.asp , где я пытаюсь Dim переменная «снова». С тех пор я пробовал с If VarType(myVar) < 8000 (поскольку массивы имеют значение VarType> 8192 ; вывод его VarType при включении страницы дает 8194) и If Not IsArray(myVar) вместо этого с тем же результатом.

Теперь я не знаю, является ли это ошибкой компилятора или ошибкой времени выполнения (и при этом я не знаю, как определить разницу в VBScript), но так как ошибка генерируется внутри блока If, который должен (? ) никогда не будет выполняться, когда определено myVar, я предполагаю, что это ошибка компилятора. Эта страница Microsoft называет ее (ошибка 1041) синтаксической ошибкой , что, как мне кажется, означает, что она по крайней мере генерируется во время компиляции, а не во время выполнения.

Так что, если это действительно ошибка компилятора и невозможно Dim одно и то же имя переменной более одного раза в любом месте в коде VBScript - независимо от того, может ли фактический оператор Dim потенциально когда-либо существовать выполняться более одного раза - тогда как справиться с такой ситуацией?

Как я могу проверить, была ли переменная Dim уже изменена, а затем Dim только если она не была?

1 Ответ

0 голосов
/ 05 июля 2018

Я избегаю делать подобные вещи по той самой причине, с которой вы сталкиваетесь. Есть не так много хороших вариантов, чтобы дать вам гибкость, которую вы хотели бы иметь.

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

Предложение 2а будет состоять в том, чтобы требовать, чтобы любая страница, включающая includes.asp , должна dim ожидаемые глобальные переменные (нет хорошего способа обеспечить это; возможно, просто большой комментарий в верхней части файл). Чтобы исправить случай, когда includes.asp используется напрямую, без включения в него где-либо еще, создайте другой файл, скажем includes_standalone.asp , который объявляет необходимые глобальные переменные и включает включенный. жерех . Используйте новый includes_standalone.asp везде, где вы использовали includes.asp самостоятельно.

Предложение 2b аналогично: переместите содержимое includes.asp в другой файл, скажем includes_contents.asp , и измените includes.asp , чтобы оно объявляет глобальные переменные и включает в себя includes_contents.asp . Затем измените везде, где вы использовали, чтобы включить includes.asp и включить includes_contents.asp после объявления и инициализации глобальных переменных.

ASP не так уж и плох, если принять его ограничения. Если вы пытаетесь превратить это во что-то, чего нет, вы просто разочаровываетесь. :-)

...