代码之家  ›  专栏  ›  技术社区  ›  FunThomas

如果一个数字是用方括号写的,比如[5]是什么意思?

vba
  •  9
  • FunThomas  · 技术社区  · 6 年前

    我正在开发一个传统的vba/excel应用程序,无意中发现了一些代码行,其中一个长字符串(从文件中读取)被切割成碎片。这些线条如下:

     Range("E16").Value = Mid(line, 49, [6])
    

    显然,写作 [6] 这意味着需要6个字符,但我从未见过将方括号放在数字周围的这种语法。

    我做了一些测试,发现放方括号对数字没有任何明显的影响。

    Dim x As Double
    x = 5.1
    Debug.Print [2], [3.1], [-5], x
    Debug.Print [3.1] * [x] * [-5]
    
    >>  2             3.1          -5             5.1 
    >> -79.05 
    

    所以,没有截断,没有舍入,没有abs值。
    我做了更多的测试来检查它是否具有类似于在变量周围加括号的魔力,以防止修改通过引用传递的值,但事实并非如此:

        x = 5.1: test2 x: Debug.Print x
        x = 5.1: test2 (x): Debug.Print x
        x = 5.1: test2 [x]: Debug.Print x
    
    Sub test2(ByRef y As Double)
        y = y * 2
    End Sub
    
    >> 10.2 
    >> 5.1
    >> 10.2
    

    令人惊讶的是,编译器甚至接受了这种语法:使用这些括号意味着什么?

    1 回复  |  直到 6 年前
        1
  •  11
  •   Mathieu Guindon    6 年前

    vba/vb6中的方括号用于访问“外部标识符”,即不合法的标识符。例如:

    Public Enum Foo
        Some
        Thing
        [Some Thing] ' please don't do this
    End Enum
    

    以及以下划线开头的隐藏成员:

    Public Property Get NewEnum() As IUnknown
        Set NewEnum = myCollection.[_NewEnum]
    End Property
    

    然而,在这个问题的代码上下文中,方括号是, as Scott indicated ,基本上是 [_Global].Evaluate 最终决定 Application.Evaluate …假设我们不在 Worksheet 模块的代码隐藏,在这种情况下,它是 Worksheet.Evaluate -两者都返回A Variant ,这意味着任何链接成员调用都是盲的,在运行时解析的后期绑定调用: Option Explicit 不能把你从打字错误中拯救出来。

    这就是为什么 Rubberduck (一个我管理/贡献的开源vbide插件项目)将它们解析为“运行时表达式”:

    Rubberduck's context-sensitive toolbar showing 'A1' as a 'runtime expression'

    换句话说,这是:

    Range("E16").Value = Mid(line, 49, [6])
    

    也可以这样写:

    [E16] = Mid(line, [49], [6])
    

    …这可能是一个糟糕的代码,有大量冗余的隐式操作正在进行。

    从来没有, 从未 任何理由都可以用方括号括一个整型文字:这只是一种迂回的方法 Integer 文字成A Double (因为工作表数值为 Variant/Double ):

    Debug.Print TypeName(42)
    Integer
    
    Debug.Print TypeName([42])
    Double
    

    通过显式转换可以更好地做到:

    Debug.Print TypeName(CDbl(42))
    Double
    

    …或者甚至用( 喘息 类型提示:

    Debug.Print TypeName(42#)
    Double