как лечить пустые параметры в вызовах функций? - PullRequest
4 голосов
/ 09 сентября 2011

Когда вы вызываете функцию типа x = myfunc(a,b,,d), что происходит с третьим параметром? это пусто? ноль? нет ничего?

У меня проблемы с моей функцией, скажем,

function myfunc(p1, p2, p3, p4)  
  if p3 <> "" then whatever  
end function

дает мне страшно type mismatch

P.S. Я пытаюсь заменить COM-объект функциями vbscript, и те пустые вызовы параметров были сделаны для COM-объектов, у которых не было проблем с ними, но vbscript они не нравятся. Я не могу изменить вызовы, только функции, поэтому мне нужно как-то обработать пустой параметр, просто не знаю как (попробовал isnull без удачи, также isimpty без удачи, и is nothing дает мне ошибку object required )

Ответы [ 3 ]

6 голосов
/ 09 сентября 2011

Тип данных пропущенных параметров - ОШИБКА.
Я написал пример, попробуйте следующее:

Function IsMissing(p)
    IsMissing = (VarType(p) = vbError)
End Function

Function Myfunc(p1, p2, p3, p4)
    If IsMissing(p1) Then Response.Write "p1 is missing "
    If IsMissing(p2) Then Response.Write "p2 is missing "
    If IsMissing(p3) Then Response.Write "p3 is missing "
    If IsMissing(p4) Then Response.Write "p4 is missing "
End Function

str = myfunc(, , , 1)
'str = myfunc(1, 2, , ) 'causes error

Примечание: Последний параметр функции / суб не может быть пустым из-за синтаксической ошибки.

2 голосов
/ 09 сентября 2011

В духе обучения человека ловить рыбу:

Функция TypeName покажет вам, какой это тип.

MsgBox TypeName(p3) ' Returns string: "Error"

Вместо if p3 <> "" вы можете проверить пропущенные аргументы, например:

    If TypeName(p3) = "Error" Then MsgBox "Whatever!"

или, предпочтительно,

    If VarType(p) = vbError Then MsgBox "Whatever!"
    ' vbError is a built-in constant whose value is 10.

Но действительно, к лучшемуНа практике дизайн вашей программы должен избегать пропуска аргументов.VBScript не предназначен для работы с «необязательными» аргументами.

0 голосов
/ 09 сентября 2011

VBScript не поддерживает необязательные параметры. Они могут быть смоделированы путем передачи массива или нулевых значений, что бесполезно в вашей ситуации, так как вы не можете изменить вызовы. Следующее решение может состоять в том, чтобы рассмотреть вопрос об изменении платформы (могу ли я предложить .Net) или хаке On Error Resume Next, как показано ниже.

'Assuming a String Parameter
Dim strOptionalParameter As String
strOptionalParameter = p3

'We set the value of the optional parameter to a variable
'in case it blows up and moves on to this next statement.
If strOptionalParameter <> "" Then
'Rest of Code Here
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...