VBA With 语句等同于其他语言
VBA With statement equivalent in other languages
在 VBA 中有一个很酷的功能,称为 With
语句,可以让您为代码块设置全局范围。这对于更改对象的多个字段和调用方法很有用。
这是一个例子:
With Forms!main
.Filter = "tel IS NOT NULL"
.FilterOn = True
.Requery 'This is a method!
If .Recordset.RecordCount> 3 Then
.BackColor = "Red"
End If
End With
在这个例子中,所有以.
开头的语句都引用了Forms!main
的字段和方法。
我在任何现代语言(Javascript、c#、python)中都没有遇到过这样的功能,我想知道是否有这样的原因?
有一篇有用的维基百科文章将此描述为 method cascading, basically a type of syntactic sugar. The article includes dart, pascal and smalltalk 与具有此功能的其他语言一样。
它也在 Javascript 中,但是 note 那:
...using with is not recommended, and is forbidden in ECMAScript 5
strict mode
const obj = {a: 1, b: 2}
with (obj) {
const k = a + b; // no need for a .
console.log(k)
}
并且根据此 answer 它也包含在 C# 9.0 中 - 阅读所有上下文的答案。
另一个有趣的 post 是 this one,它与我对 'why' 这个问题的回答有一些相似之处。此功能并不广泛。
'sugar'可以得到'too sweet'例如:
k = 99
With foo
With .bar
With .baz
If Not .qux Is Nothing Then
k = 4
End If
End With
For i = 1 to .NumberOfThings
k = k + i
Next i
End With
.DoAllTheThings(k, SomeOtherVariable)
End With
与您更简洁易读的示例相比,突然使用 With
并没有那么有用。我们可以看到该功能引起了争议(由于 over-use),这就是它没有真正成为主流的原因。
在 VBA 中有一个很酷的功能,称为 With
语句,可以让您为代码块设置全局范围。这对于更改对象的多个字段和调用方法很有用。
这是一个例子:
With Forms!main
.Filter = "tel IS NOT NULL"
.FilterOn = True
.Requery 'This is a method!
If .Recordset.RecordCount> 3 Then
.BackColor = "Red"
End If
End With
在这个例子中,所有以.
开头的语句都引用了Forms!main
的字段和方法。
我在任何现代语言(Javascript、c#、python)中都没有遇到过这样的功能,我想知道是否有这样的原因?
有一篇有用的维基百科文章将此描述为 method cascading, basically a type of syntactic sugar. The article includes dart, pascal and smalltalk 与具有此功能的其他语言一样。
它也在 Javascript 中,但是 note 那:
...using with is not recommended, and is forbidden in ECMAScript 5 strict mode
const obj = {a: 1, b: 2}
with (obj) {
const k = a + b; // no need for a .
console.log(k)
}
并且根据此 answer 它也包含在 C# 9.0 中 - 阅读所有上下文的答案。
另一个有趣的 post 是 this one,它与我对 'why' 这个问题的回答有一些相似之处。此功能并不广泛。
'sugar'可以得到'too sweet'例如:
k = 99
With foo
With .bar
With .baz
If Not .qux Is Nothing Then
k = 4
End If
End With
For i = 1 to .NumberOfThings
k = k + i
Next i
End With
.DoAllTheThings(k, SomeOtherVariable)
End With
与您更简洁易读的示例相比,突然使用 With
并没有那么有用。我们可以看到该功能引起了争议(由于 over-use),这就是它没有真正成为主流的原因。