Date: Tue, 06 Oct 1998 17:12:57 +0100
From: Serge Fantino <fantino@math.unice.fr>
To: "Sylvain BOULM'E" <Sylvain.Boulme@lip6.fr>
Subject: Re: porte des definitions des variables de classe
Sylvain BOULM'E wrote:
> Bonjour,
>
> Il me semble que c'est dans la semantique des classes
> de Ocaml, qui supportent desormais les "variables statiques de classes"
> partagees par tous les objets de la classe. (Les gens de Ocaml me
> corrigeront ...)
>
> Ainsi,
>
> class test1 =
> object
> val v = ref 5
> method get = !v
> method set x = v:=x
> end;;
>
> est equivalent a
>
> class test1 = let v1=ref 5 in
> object
> val v=v1
> ...
>
> Dans les 2 cas,
>
> let a=new test1 and b=new test1 in (b#set 4; a#get);;
>
> retourne 4.
>
Effectivement, OCaml-2.0 semble fonctionné suivant ce schéma.
Je trouve cette "nouveauté" embarrassante:
- elle est ambigue;
Cela va a l'encontre du "sens commun". Les variables d'instance sont
declarees dans "object": je m'attends donc a ce que la porté de la variable
soit locale à une instance de la classe.
Lorsque je declare:
class test1 =
object
val v = ref 5
method get = !v
method set x = v:=x
end;;
je m'attends a ce que la variable v soit locale à chaque nouvel objet
construit à partir de (new test1).
D'ailleurs, il est confondant de voir que la déclaration suivante:
class test3 =
object
val mutable v = 5
method get = v
method set x = v<-x
end;;
se comporte différement de test1 !
- elle n'est pas consistante
Rien ne me previent du changement de fonctionnalité dans ce cas particulier.
Il suffit de supprimer ou d'ajouter un paramètre à une classe pour en changer
complètement la sémantique.
Si je redefinis test1 :
class test1 (x:int) =
object
val v = ref x
method get = !v
method set x = v:=x
end;;
alors la variable v n'est plus partagée...
- elle n'est pas necessaire;
Si on en a besoin, on peut simplement partager des variables "statiques"
entre différentes instances de la meme classe.
Enfin c'est mon avis d'utilisateur. Pour la petite histoire, il m'a fallu
tout un weekend pour comprendre pourquoi mon code ne marchait plus sous
OCaml-2.0, alors que la version 1.07 marche tres bien...
Objectivement votre,
Serge Fantino
> Par contre c'est different de
>
> class test2 () = let v1=ref 5 in
> object
> val v=v1
> ...
>
> let a=new test2 () and b=new test2 () in (b#set 4; a#get);;
>
> retourne 5.
>
> Encore mieux,
>
> let f=new test2;;
> retourne
> val f : unit -> test2 = <fun>
>
> Une classe sert en fait a generer (au travers du new) des fonctions
> a valeur dans les objets (de cette classe). Et comme pour les autres
> fonctions de Caml, on a la possibilite d'utiliser des variables locales...
> Sylvain.
>
> PS: j'aurai pu ecrire aussi test2 sous la forme
>
> class test2 () =
> object
> val v=ref 5
> ...
>
> Il est aussi interessant de remarquer que
>
> class test3 =
> object
> val mutable v = 5
> method get = v
> method set x = v<-x
> end;;
>
> let a = new test3 and b=new test3 in (b#set 4; a#get);;
>
> retourne 5
This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:16 MET