[ocaml] класс и определение переменной
От: _rasta  
Дата: 11.06.08 06:24
Оценка:
еще раз я

код:
class c = object (self)
  val v = self;
  val s = "test";

  method get_s () = s;
end;;

let _ =
  let i = new c
  in print_endline (i#get_s ());;


ocamlc ./test.ml
File "./test.ml", line 2, characters 10-15:
The instance variable self
cannot be accessed from the definition of another instance variable


вопрос: есть способ получить доступ к self при определении переменной?

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
Re: [ocaml] класс и определение переменной
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 11.06.08 07:50
Оценка:
Здравствуйте, _rasta, Вы писали:

_>вопрос: есть способ получить доступ к self при определении переменной?


В этот момент тип self еще не известен, как я понял. Придется обращаться из метода.
Цитата из документации:
class printable_point x_init =
   object (s)
     val mutable x = x_init
     method get_x = x
     method move d = x <- x + d
     method print = print_int s#get_x
   end;;

Dynamically, the variable s is bound at the invocation of a method. In particular, when the class printable_point is inherited, the variable s will be correctly bound to the object of the subclass.

Re: [ocaml] класс и определение переменной
От: palm mute  
Дата: 11.06.08 07:51
Оценка:
Здравствуйте, _rasta, Вы писали:

_>вопрос: есть способ получить доступ к self при определении переменной?

Нет, self доступен только из методов и initializer'ов. Что вы пытаетесь сделать?
Re[2]: [ocaml] класс и определение переменной
От: _rasta  
Дата: 11.06.08 08:14
Оценка:
palm mute wrote:

> Нет, self доступен только из методов и initializer'ов. Что вы пытаетесь

> сделать?

хочу сделать иерархию объектов.

сейчас устроено так:
class c1 ~parent = object (self)
end;;

class c2 = object (self)
  val mutable v = None;
  val s = "test";

  initializer
        v <- Some (new c1 ~parent:self);

  method get_s () = s;
end;;

let _ =
  let i = new c2
  in print_endline (i#get_s ());;


просто не очень нравится вот так вот инициализировать переменные, тем более
что потом приходится каждый раз match-ить.

функцию вроде:
let some o = match o with
  | Some v -> v
  | None   -> raise Option_is_none;;


написать конечно можно, но... хочется без этого

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
Re[3]: [ocaml] класс и определение переменной
От: palm mute  
Дата: 11.06.08 09:28
Оценка:
Здравствуйте, _rasta, Вы писали:

_>хочу сделать иерархию объектов.

_>просто не очень нравится вот так вот инициализировать переменные, тем более
_>что потом приходится каждый раз match-ить.
_>написать конечно можно, но... хочется без этого

Наверно, совсем без этого не получится. Еще один вариант:
class child parent = object
  method hello : unit = begin
    print_endline "hello";
    (Lazy.force parent)#notify
  end
end
and parent child = object
  method notify : unit = print_endline "notified"
  method foo : unit = (Lazy.force child)#hello
end

let make_parent () = 
  let rec p = lazy (new parent c)
  and c = lazy (new child p) in
    Lazy.force p
Re[4]: [ocaml] класс и определение переменной
От: _rasta  
Дата: 11.06.08 10:00
Оценка:
palm mute wrote:

> _>хочу сделать иерархию объектов.

> Наверно, совсем без этого не получится. Еще один вариант:

мдя... не лучше

но спасибо и на этом

--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.