Что это означает, если число написано в квадратных скобках, как [5] - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю над унаследованным приложением 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 Ответ

0 голосов
/ 07 февраля 2019

Квадратные скобки в 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

Однако в контексте кода в этом вопросе квадратные скобки: как сказал Скотт , по существу сокращенная запись для [_Global].Evaluate, которая в конечном итоге разрешается до Application.Evaluate ... при условии, что мы не находимся в коде модуля Worksheet, в этом случае это сокращение для Worksheet.Evaluate -и оба возвращают 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 в Double (поскольку числовые значения рабочего листа Variant/Double):

Debug.Print TypeName(42)
Integer

Debug.Print TypeName([42])
Double

Что гораздо лучше сделать сявное преобразование:

Debug.Print TypeName(CDbl(42))
Double

... или даже с подсказкой типа ( gasp ):

Debug.Print TypeName(42#)
Double
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...