任何在F#中声明新变量而不为其赋值的方法吗?
答案 0 :(得分:16)
见艾丹的评论。
如果你坚持,你可以这样做:
let mutable x = Unchecked.defaultof<int>
这将为数值类型分配绝对零值(0
,引用类型为null
,值类型为struct-zero。
答案 1 :(得分:7)
您还可以使用explicit field语法:
type T =
val mutable x : int
答案 2 :(得分:7)
知道为什么作者需要在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")
答案 3 :(得分:4)
我同意所有说过“不要这样做”的人。但是,如果您确信自己确实处于必要状态,则可以执行以下操作:
let mutable naughty : int option = None
...然后再分配一个值。
naughty <- Some(1)
但请记住,所有说“改变你的方法”的人都可能是对的。我在F#全时编码,我从来没有必要声明一个未分配的'变量'。
另一点:尽管你说使用F#不是你的选择,但我预测你很快会认为自己很幸运能够使用它!
答案 4 :(得分:2)
F#变量默认是不可变的,因此以后不能分配值。因此,在没有初始值的情况下声明它们会使它们毫无用处,因此没有机制可以这样做。
可以说,一个可变变量声明可以在没有初始值的情况下声明并且仍然有用(它可以像C#变量一样获取初始默认值),但F#的语法不支持这一点。我猜这是为了保持一致性,因为可变的变量槽不是惯用的F#所以没有动力去制作特殊情况来支持它们。