在函数内取消引用ref会产生不同的结果.为什么?

Jos*_*del 0 f#

在此示例中,正在热切地评估get_final_answer,并始终返回0.0.我认为包含refs的表达式由于其固有的可变特性而被区别对待(并且在这种情况下并未急切评估).我预计它会返回7.0.

let FinalAnswer = ref 0.0
let get_final_answer = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer        // fails, returns 0.0

let rec eval_expr_works =
        FinalAnswer := 7.0
        !FinalAnswer           // works, return 7.0
Run Code Online (Sandbox Code Playgroud)

如何在我更新它的块之外取消引用FinalAnswer?

Yin*_*Zhu 6

get_final_answerin let get_final_answer = !FinalAnswer是浮点值,而不是函数.它的值为0.0,与赋值后无关FinalAnswer.

将它作为一个函数获得你想要的:

let FinalAnswer = ref 0.0
let get_final_answer() = !FinalAnswer

let rec eval_expr_fail =
        FinalAnswer := 7.0
        get_final_answer ()       //  returns 7.0
Run Code Online (Sandbox Code Playgroud)

  • 功能也是价值!你的意思是"是一个浮动,而不是一个功能". (2认同)