有什么方法可以在 F# 中声明一个新变量而不给它赋值?
问问题
6868 次
5 回答
16
见艾丹的评论。
如果你坚持,你可以这样做:
let mutable x = Unchecked.defaultof<int>
这将分配绝对零值(0
对于数字类型,null
对于引用类型,对于值类型,结构零)。
于 2012-06-18T15:57:30.757 回答
8
知道作者为什么在 F# 中需要它会很有趣(预期用途的简单示例就足够了)。
但我猜你可能在 C# 中使用未初始化变量的常见情况之一是当你调用带out
参数的函数时:
TResult Foo<TKey, TResult>(IDictionary<TKey, TResult> dictionary, TKey key)
{
TResult value;
if (dictionary.TryGetValue(key, out value))
{
return value;
}
else
{
throw new ApplicationException("Not found");
}
}
幸运的是,在 F# 中,您可以使用更好的语法来处理这种情况:
let foo (dict : IDictionary<_,_>) key =
match dict.TryGetValue(key) with
| (true, value) -> value
| (false, _) -> raise <| ApplicationException("Not Found")
于 2012-06-19T07:34:11.073 回答
7
您还可以使用显式字段语法:
type T =
val mutable x : int
于 2012-06-18T16:23:54.607 回答
4
我同意所有说“不要这样做”的人的观点。但是,如果您确信您确实需要这样做,您可以这样做:
let mutable naughty : int option = None
...然后稍后分配一个值。
naughty <- Some(1)
但请记住,所有说过“改变你的方法”的人可能都是对的。我全职使用 F# 编写代码,而且我从来不需要声明未分配的“变量”。
还有一点:虽然你说使用 F# 不是你的选择,但我预测你很快就会认为自己很幸运能够使用它!
于 2012-06-19T12:48:40.200 回答
2
F# 变量在默认情况下是不可变的,因此您以后无法赋值。因此,在没有初始值的情况下声明它们会使它们毫无用处,因此没有机制可以这样做。
可以说,可变变量声明可以在没有初始值的情况下声明并且仍然有用(它可以像 C# 变量一样获得初始默认值),但 F# 的语法不支持这一点。我猜这是为了保持一致性,并且因为可变变量插槽不是惯用的 F#,所以几乎没有动力制作特殊情况来支持它们。
于 2012-06-18T15:56:01.153 回答