jpi*_*son 3 f# pass-by-reference
我需要在 F# 中调用bool.TryParse并且我在编译器/Ionide 上遇到了一些困难。
前任。
let value = true
let parsable = bool.TryParse("True", &value)
Run Code Online (Sandbox Code Playgroud)
我在 Ionide for VSCode 中看到的错误如下所示。
val value : bool 全名:value
装配:example3
'ByRefKinds.InOut' 类型与类型 'ByRefKinds.In'F# Compiler(1) 不匹配
这是我在 F# 中使用 call by ref 关键字和语法的第一个示例,所以我不确定我做错了什么,并且byrefs文档似乎对理解这个特定场景没有多大帮助。
事实证明,我在示例中缺少的主要内容是它value不是可变的,因为在此上下文中调用时需要它。
工作示例:
let mutable value = true
let parsable = bool.TryParse("True", &value)
Run Code Online (Sandbox Code Playgroud)
该解决方案阅读之后来找我稍微有关GitHub上的问题有关Span<T>,然后还打在周围dotnet fsi至少给了我下面的线索。
let parsable = bool.TryParse("True", &value);;
-------------------------------------^^^^^^
stdin(34,38): error FS3230: A value defined in a module must be mutable in order to take its address, e.g. 'let mutable x = ...'
Run Code Online (Sandbox Code Playgroud)
然而事实证明,F# 似乎在Try-Parse 模式周围也有一些语法糖,我在进一步玩弄这个例子后开始回忆。这简化为以下调用bool.TryParse.
let value = true
let (parsable, _) = bool.TryParse "True"
Run Code Online (Sandbox Code Playgroud)
或者,无需parsable在单个表达式中绑定和指定默认值,以下示例可能更优雅。
let value = match bool.TryParse "True" with
| true, value -> value
| false, _ -> true
Run Code Online (Sandbox Code Playgroud)
也许不同的调用方式bool.TryParse和其他 Try-Parse 方法各有利弊,但重要的是,我找到了一些可行的解决方案,让我克服了最初的绊脚石,因为缺乏有关该主题的 F# 文档。