为什么`find`通过引用获取参数然后取消引用?

时间:2019-03-01 16:36:44

标签: rust iterator

在以下代码段中,我不明白为什么闭包通过引用(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

我缺少明显的东西吗?

1 个答案:

答案 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