什么是惯用的 F# 等同于声明一个变量供以后在 C# 中使用
What is the idiomatic F# equivalent to declaring a variable for later use in C#
在 C# 中,我可以声明未初始化的变量,这些变量稍后会在 class 的各种方法中赋值。例如,在 NUnit 测试中,我可以声明一个类型化变量,该变量仅在设置方法中初始化,然后在各种测试中重复使用。
private MyTestClass sut;
public Setup()
{
sut = new MyTestClass();
etc.
}
public FirstTest()
{
sut.DoSomeWork(1);
}
public SecondTest()
{
sut.DoSomeWork(2);
}
我想在 F# 中做同样的事情。然而,根据 this 和其他人的说法,未分配的 'variables' 并不是 F# 中完成的事情。
就我的 F# 测试而言,测试不在任何类型中,只是在一个模块中,因此 [<DefaultValue>] val
将不起作用。
使用 mutable
感觉不对,因为这似乎是 F# 编码人员的最后选择。
既然 idomatic F# 不应该需要未分配的值,那么 "correct" 解决这个问题的方法是什么?
您可以使用函数和值。无需声明未赋值的变量。
let makeTestClass() =
MyTestClass()
// etc.
let ``First test``() =
let sut = makeTestClass()
sut.DoSomeWork()
let ``Second test``() =
let sut = makeTestClass()
sut.DoSomeWork()
您可以使用 lazy
:
let sut = lazy (new MyTestClass())
lazy
推迟表达式的执行,直到需要结果为止。对惰性值的后续请求不需要重新计算它,它只是 returns 上次的存储结果。
那么你可以这样做:
let ``First test``() =
sut.Force().DoSomeWork(1)
let ``Second test``() =
sut.Force().DoSomeWork(2)
如果初始化成本高且您不想重复,这可能是合适的。
在 C# 中,我可以声明未初始化的变量,这些变量稍后会在 class 的各种方法中赋值。例如,在 NUnit 测试中,我可以声明一个类型化变量,该变量仅在设置方法中初始化,然后在各种测试中重复使用。
private MyTestClass sut;
public Setup()
{
sut = new MyTestClass();
etc.
}
public FirstTest()
{
sut.DoSomeWork(1);
}
public SecondTest()
{
sut.DoSomeWork(2);
}
我想在 F# 中做同样的事情。然而,根据 this 和其他人的说法,未分配的 'variables' 并不是 F# 中完成的事情。
就我的 F# 测试而言,测试不在任何类型中,只是在一个模块中,因此 [<DefaultValue>] val
将不起作用。
使用 mutable
感觉不对,因为这似乎是 F# 编码人员的最后选择。
既然 idomatic F# 不应该需要未分配的值,那么 "correct" 解决这个问题的方法是什么?
您可以使用函数和值。无需声明未赋值的变量。
let makeTestClass() =
MyTestClass()
// etc.
let ``First test``() =
let sut = makeTestClass()
sut.DoSomeWork()
let ``Second test``() =
let sut = makeTestClass()
sut.DoSomeWork()
您可以使用 lazy
:
let sut = lazy (new MyTestClass())
lazy
推迟表达式的执行,直到需要结果为止。对惰性值的后续请求不需要重新计算它,它只是 returns 上次的存储结果。
那么你可以这样做:
let ``First test``() =
sut.Force().DoSomeWork(1)
let ``Second test``() =
sut.Force().DoSomeWork(2)
如果初始化成本高且您不想重复,这可能是合适的。