F#中字符串切片表达式.[3..7]实际调用的是哪个函数?
问题背景
我发现F#中可以通过切片方式定义子字符串:
let s = "the quick brown fox" s.[4..8] // returns a string! val it : string = "quick"
该切片表达式的特殊之处在于返回值为string类型,而非char集合。我原本以为F# Core中的string类型实现了会返回string的GetSlice方法,但查看F# Core的string.fs源码后发现并非如此。请问此处的切片操作实际调用的是哪个函数?
回答
这个切片操作是F#编译器对字符串类型做的内置语法糖处理,实际编译后会直接调用System.String.Substring方法。
F#的切片语法本身支持对没有显式实现GetSlice方法的内置类型做特殊适配,字符串就是其中之一:
- 完整切片表达式
s.[start..end]会被编译器自动转换为s.Substring(start, end - start + 1) - 省略起始索引的
s.[..end]等价于s.Substring(0, end + 1) - 省略结束索引的
s.[start..]等价于s.Substring(start)
所以返回值自然就是string类型,不需要F# Core的string类型额外实现对应的GetSlice方法。
内容的提问来源于stack exchange,提问作者citykid
相关产品推荐
相关产品推荐

