选择具有布尔函数的Case

时间:2013-12-27 16:38:28

标签: vba ms-access ms-access-2007 access-vba

我正在构建一个JSON递归下降解析器,我遇到了一些有点烦人的情况。

使用Select Case语句来确定接下来需要解析的内容通常很方便,但偶尔需要将字符的类用作标准。 有没有办法将布尔函数作为条件语句中的条件包含? 或者,更一般地说,是否可以在Case语句中包含一个布尔条件而不依赖于与选择Case变量?我担心这是一个全有或全无的命题,我将不得不为If_Then-ElseIf-Else-End_If的罗嗦海洋改变精美简洁的Select Case语句。

这很好用:

Select Case curr_char
    Case "{"
        'Parse an Object
    Case "["
        'Parse an Array
    Case Else
        'Parser Error
End Select

但假设我有一个函数Private Function isAlpha(str As String) As Boolean。这不起作用,因为IsAlphaTrue / False的结果与curr_char的值进行了比较:

Select Case curr_char
    Case IsAlpha(curr_char)
        MsgBox "It's alpha!"
    Case "{"
        'Parse an Object
    Case "["
        'Parse an Array
    Case Else
        'Parser Error
End Select

为了避免改变现有代码的结构,我使用了丑陋,hacky,kludgy:

Select Case True
    Case IsAlpha(curr_char)
        MsgBox "It's alpha!"
    Case curr_char = "{"
        'Parse an Object
    Case curr_char = "["
        'Parse an Array
    Case Else
        'Parser Error
End Select

1 个答案:

答案 0 :(得分:1)

我认为您可以使用评估curr_char的中间函数执行您想要的操作,并将Select Case基于该函数的返回值。

Select Case Categorize(curr_char)
    Case "isAlpha = True"
        MsgBox "It's alpha!"
    Case "{"
        'Parse an Object
    Case "["
        'Parse an Array
    Case Else
        'Parser Error
End Select

Public Function Categorize(ByVal pChar As String) As String
    Dim strReturn As String

    If isAlpha(pChar) Then
        strReturn = "isAlpha = True"
    Else
        strReturn = pChar
    End If
    Categorize = strReturn
End Function

我认为这符合您描述的要求,但不确定我有多喜欢它。如果你说“哎呀!”我就不会被冒犯。

但是,这种方法是可扩展的。您可以调整Categorize()来处理其他函数,然后扩展Select Case

Case "SomeOtherFunction = True"