是否可以通过引用调用函数?
例如: 如果我在func1中有一个变量x并且我想将它发送到func2,那么它可以改变它(不返回它的新值等)。
let func1 =
let mutable x = 1
func2 x
System.Console.WriteLine(x)
let func2 x =
x <- x + 1
所以调用func1会打印“2”..
有可能吗?如果是这样,怎么样?
感谢。
答案 0 :(得分:2)
您可以使用&
运算符和byref
关键字。
let func1 =
…
func2 (&x)
…
let func2 (x : int byref) =
…
有关详细信息,请参阅MSDN: Reference cells (F#)。
答案 1 :(得分:2)
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)
答案 2 :(得分:2)
你所要求的是可能的,但它与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必须在之前定义。
答案 3 :(得分:1)
您可以使用参考单元格:
let func1 ref =
ref := !ref+1
let func2 () =
let x = ref 1
func1 x
System.Console.WriteLine(!x)
但这不是'最佳实践'(温和地说)用功能语言来做这些事情