是否有通过引用调用函数的选项?
例如:如果我在 func1 中有一个变量 x 并且我想将它发送到 func2 以便它可以更改它(而不返回它的新值等)
let func1 =
let mutable x = 1
func2 x
System.Console.WriteLine(x)
let func2 x =
x <- x + 1
所以调用 func1 将打印“2”..
是否可以?如果是这样,怎么做?
谢谢。
是否有通过引用调用函数的选项?
例如:如果我在 func1 中有一个变量 x 并且我想将它发送到 func2 以便它可以更改它(而不返回它的新值等)
let func1 =
let mutable x = 1
func2 x
System.Console.WriteLine(x)
let func2 x =
x <- x + 1
所以调用 func1 将打印“2”..
是否可以?如果是这样,怎么做?
谢谢。
您可以使用&
运算符和byref
关键字。
let func1 =
…
func2 (&x)
…
let func2 (x : int byref) =
…
有关详细信息,请参阅MSDN:参考单元 (F#)。
从 C# 风格代码的严格翻译是这样的:
let func2 (x : byref<_>) =
x <- x + 1
let func1 =
let mutable x = 1
func2 &x
System.Console.WriteLine(x)
但强烈建议坚持参考。
编辑:正如所指出的(见评论),你可能意味着 func1 将是一个函数:
let func2 (x : byref<_>) =
x <- x + 1
let func1 () =
let mutable x = 1
func2 &x
System.Console.WriteLine(x)
您要求的是可能的,但这与 F# 鼓励的功能方法几乎相反。有什么强有力的理由你不能这样做:
let func2 x =
x + 1
let func1() =
let x = 1
let y = func2 x
System.Console.WriteLine(y)
这是在函数式编程(和 F#)中做这类事情的更惯用的方式。或者如果你必须改变 x 那么这个怎么样:
let func2 x =
x + 1
let func1() =
let mutable x = 1
x <- func2 x
System.Console.WriteLine(x)
顺便说一句,在 F# 中,必须在使用 func2之前对其进行定义。
您可以使用参考单元格:
let func1 ref =
ref := !ref+1
let func2 () =
let x = ref 1
func1 x
System.Console.WriteLine(!x)
但是用函数式语言做这些事情并不是“最佳实践”(委婉地说)