2015-06-26 3 views
1

так что я пытаюсь определить статическую (глобальную) переменную в module.Как определить статическую переменную в модуле?

Я часто использовал class при программировании в OCaml. И теперь, когда я пытаюсь использовать Module систему, я просто понять, я не знаю, как определить статический (глобальный) переменной в OCaml .. Позор мне ..

Вот пример:

module Util = struct 

    let l = ref [] 

    let get_l = 
     !l 
    let set_l x = 
    l := x::!l 

end 

open Util 

let() = 
    let() = set_l 1 in 
    let() = set_l 2 in 
    print_int (List.length get_l) 

ИМХО, функция повторного вызова set_l создаст новый экземпляр l, который не то, что мне нужно ..

Может кто-нибудь дать мне руководство по определении static переменной в module?

ответ

3

ИМХО, повторно вызов функции set_l создаст новый экземпляр л, который не то, что мне нужно ..

Интуиция неверен.

l := x :: !l 

будет предварять в x к текущему значению l, и назначить эту вновь созданную ценность l, который фактически является указателем.

Никаких новых экземпляров не будет создано.

Проблема в вашем коде, находится в get_l. Он будет оценен сразу после определения let l = ref []. Например, в момент времени, когда l по-прежнему пуст. Это означает, что вам нужно отсрочить разыменование до момента времени, когда это действительно необходимо. Итак, что вы действительно хотите следующее:

let get_l() = 
    !l 

И

let() = 
    let() = set_l 1 in 
    let() = set_l 2 in 
    print_int (List.length (get_l())) 

Теперь get_l() будет разыменовать в l ссылки только после того, как вы сделали это два задания.

+0

Спасибо @ivg .. Я не ожидал, что это окажется ошибкой ... – computereasy

+0

@computereasy это не ошибка ocaml! В одном случае 'get_l' представляет собой просто значение (которое вычисляется при его определении) и является неизменным, поэтому оно не должно давать вам обновленный' l'. В версии @ivg используется функция, которая может искать текущее значение, обозначенное буквой 'l'. –

Смежные вопросы