Как сказано в связанных вопросах и ответах, Set
используется в VBA для назначения ссылки на объект. Ключевое слово Let
может использоваться для присвоения значений, но ключевое слово Let
в значительной степени устарело / избыточно.
Вот почему у вас есть следующие ключевые слова в определениях мутатора свойств:
Private mSomething As Variant
Public Property Let Something(ByVal value As Variant)
mSomething = value ' value is a primitive
End Property
Public Property Set Something(ByVal value As Variant)
Set mSomething = value ' value is an object reference
End Property
Пока все хорошо. Разница между этим:
Set json_ParseObject.Item(json_Key) = json_ParseValue(json_String, json_Index)
А это:
json_ParseObject.Item(json_Key) = json_ParseValue(json_String, json_Index)
Это потому, что json_ParseValue
возвращает Variant
, который может содержать что угодно, включая ссылку на объект или простое значение, тогда ему нужно использовать ключевое слово Set
при назначении ссылки и не указывать его (или использовать Let
ключевое слово) при присвоении значения.
Невозможно сказать, не глядя на детали реализации и не увидев, что именно возвращается, но также возможно, что присвоение Let
может быть назначением члену по умолчанию - и что вызов члена по умолчанию является неявным, и это чертовски запутанно на самом деле.
Это точно так же, как при назначении значения ячейки в Excel VBA:
Dim r As Range
Set r = ActiveSheet.Range("A1")
против
Dim r As Double
r = ActiveSheet.Range("A1") 'implicit call to ActiveSheet.Range("A1").[_Default]
Две инструкции выглядят отличающимися только потому, что у одной есть ключевое слово Set
, а у другой нет, однако реальная разница заключается в неявном вызове члена скрытого свойства с именем [_Default]
, который имеет атрибут VB_UserMemId = 0
, который делает этот член классом член по умолчанию .
Путаница проистекает из неявных вызовов членов по умолчанию , которые заставляют код говорить что-то, а на самом деле делают что-то еще.
Rubberduck (проект надстройки OSS VBIDE, которым я управляю) имеет проверку кода, которая находит неявные назначения членов по умолчанию в раннем коде:
Неявное назначение членов по умолчанию
Такие присваивания выглядят так, как будто они присваивают переменную объекта типу значения на поверхности, но они фактически присваивают элемент этого объекта по умолчанию, неявно. Рассмотрите возможность явного обращения к элементу по умолчанию для улучшения читаемости.