еще раз я
код:
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
Здравствуйте, _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.
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
Здравствуйте, _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
palm mute wrote:
> _>хочу сделать иерархию объектов.
> Наверно, совсем без этого не получится. Еще один вариант:
мдя... не лучше
но спасибо и на этом
--
-- via knode --
Posted via RSDN NNTP Server 2.1 beta