在F#中,针对表达式 "some string".[3 .. 7] 调用的函数是什么?

3

刚刚发现使用F#可以将子字符串定义为切片:

let s = "the quick brown fox"
s.[4..8] // returns a string!
val it : string = "quick"

值得注意的是,切片表达式返回一个字符串,而不是字符集合。我认为F#核心中的字符串实现了GetSlice方法,该方法将返回一个字符串,但事实并非如此:

https://github.com/dotnet/fsharp/blob/main/src/fsharp/FSharp.Core/string.fs

我真的很想知道这里发生了什么?哪个函数被调用来进行切片操作?


根据 https://sharplab.io 的反编译,它使用了 String.Substring() 方法。不确定结果的准确性。 - Eugene Fotin
1个回答

3
类型检查器在此处查找切片的语法形式:https://github.com/dotnet/fsharp/blob/main/src/fsharp/CheckExpressions.fs#L6351 这最终导致发出对GetStringSlice的调用:https://github.com/dotnet/fsharp/blob/d5cc1167df4201b7cf9adf4b6b71e9494be556f4/src/fsharp/FSharp.Core/prim-types.fs#L6039 该路径为类型检查器--> FSharp.core工具集 --> 一系列调用链直到发射。
那么,为什么不在FSharp.Core中给String进行类型扩展呢?不知道。这是很久以前做出的决定。有时编译器会出现这样跳跃的路径。

Philip Carter 什么都知道 ;) 感谢您的清晰澄清! - citykid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接