Разыменование ссылки внутри функции дает разные результаты.Зачем? - PullRequest
0 голосов
/ 20 мая 2011

В этом примере get_final_answer с нетерпением оценивается и всегда возвращает 0.0.Я думал, что выражения, содержащие ссылки, обрабатывались по-разному (и в этом случае не были оценены с нетерпением) из-за их изменчивых характеристик.Я ожидал, что он вернется 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

Как разыменовать FinalAnswer вне блока, в котором я его обновил?

1 Ответ

6 голосов
/ 20 мая 2011

get_final_answer в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...