在以下代码段中,我不明白为什么闭包通过引用(Imports System
Imports System.Net
Imports System.IO
Class Program
Public Const IP As String = "63.148.239.195"
Public Const API_KEY As String = "at_6ZsRWjq..."
Public Const API_URL As String = "https://geo.ipify.org/api/v1?"
Private Shared Sub Main()
Dim url As String = API_URL & $"apiKey={API_KEY}&ipAddress={IP}"
Dim resultData As String = String.Empty
Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
Using response As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
Using stream As Stream = response.GetResponseStream()
Using reader As StreamReader = New StreamReader(stream)
resultData = reader.ReadToEnd()
End Using
End Using
End Using
Console.WriteLine(resultData)
End Sub
End Class
来接受其参数s
,然后取消引用(&s
):
*s
我缺少明显的东西吗?
答案 0 :(得分:3)
这是惯用的。某些人可能会对何时确切取消引用有不同的偏好,并且/或者使用.as_str()
而不是取消引用,但总的来说还可以。
在您的情况下,.iter()
通过引用遍历String
,因此它提供了&String
元素。
然后.find()
允许您再次通过引用 来访问每个迭代的元素,因此最终得到一个&&String
参数。即使在特定情况下引用的引用不是理想的选择,.find()
是一个通用函数,必须始终与任何类型兼容,因此它只是盲目地进行引用。
在参数&s
中,引用是与相反的。闭包参数的语法为:
|pattern: type|
,并且类型是可选的。所以剩下的就是模式。
您的关闭时间是:
|pattern: &&String|
以及您的模式:
|&s: &&String|
匹配&
的一级,因此您最终以s
为&String
。
然后您要比较类型s
的{{1}}与&String
。要比较相等的类型,请使用String
将&String
解除引用到String
。