Version française
Home     About     Download     Resources     Contact us    
Browse thread
porté des définitions des variables de classe
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Serge Fantino <fantino@m...>
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