caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jerome Vouillon <Jerome.Vouillon@inria.fr>
To: Serge Fantino <fantino@math.unice.fr>
Cc: caml-list@inria.fr, Vyskocil Vladimir <vyskocil@math.unice.fr>
Subject: Re: porte des definitions / initialisation des variables de classe
Date: Wed, 7 Oct 1998 23:25:33 +0200	[thread overview]
Message-ID: <19981007232533.54502@pauillac.inria.fr> (raw)
In-Reply-To: <361B6699.EFF02DF3@math.unice.fr>; from Serge Fantino on Wed, Oct 07, 1998 at 02:03:21PM +0100

On Wed, Oct 07, 1998 at 02:03:21PM +0100, Serge Fantino wrote:
> Bon. Je vais essayer de vous faire sentir ce qui me gene sur un exemple:
> 
> class test1 =
> object
>     val x = Random.int 1000
>     method get = x
> end
> 
> Je m'attends a ce que chaque nouvel objet cree a partir de test1 soit initialise
> avec une valeur différente pour x.
> En effet, l'initialisation est effectuee dans le corps de l'"object", elle ne
> devrait donc etre effectuee que lorsque j'instancie un nouvel objet.

Le contenu des enregistrements (dans le language de base) et des
structures (dans le langage de module) est évalué. Il me paraît donc
naturel que ce soit également le cas pour "object ... end" dans le
langage de classe.

> Actuellement, que ce passe-t-il ? Si je declare la classe test3:
>
> class test3 range =
> object
>     val x = Random.int range
>     method get = x
> end
>
> alors chaque nouvelle instance est initialisée avec une valeur
> différente de \ x, ie l'initialisation est effectuée au moment de
> l'instanciation.
>
> Si je declare maintenant:
> class test3_1000 = test3 1000;;
>
> il est logique de s'attendre a ce que test3_1000 soit une classe
> specialisée de test3, fonctionnant de facon similaire a test3. Les
> expressions suivantes devraient retourner des resultats similaires,
> ie des valeurs différentes <1000 pour chaque instance:
> let l1 = List.map (fun _ -> (new test3 1000)#get) [0;0;0;0]
> let l2 = List.map (fun _ -> (new test3_1000)#get) [0;0;0;0]
>
> Helas, la liste l2 repete la meme valeur...  pourquoi ?

Je ne comprends pas trop pourquoi ce résultat te choque. Les arguments
que tu donnes pourraient tout aussi bien s'appliquer à l'exemple
suivant :

type t = { x : int }
let test3 range = { x = Random.int range }
let test3_1000 = test3 1000
let l1 = List.map (fun _ -> (test3 1000).x) [0;0;0;0]
let l2 = List.map (fun _ -> (test3_1000).x) [0;0;0;0]

En fait, je crois que ce qui apparaît comme pas très intuitif est
que deux objets puissent partager une même valeur mutable. Mais c'est
également le cas lorsque l'on utilise Oo.copy ou {< ... >}.

-- Jérôme





  reply	other threads:[~1998-10-08  6:59 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-10-05 15:10 porté des définitions " Serge Fantino
1998-10-06 12:35 ` port des d finitions " Sylvain BOULM'E
1998-10-06 16:12   ` porte des definitions " Serge Fantino
1998-10-07  7:30     ` Pierre Weis
1998-10-07 13:03       ` porte des definitions / initialisation " Serge Fantino
1998-10-07 21:25         ` Jerome Vouillon [this message]
1998-10-08 13:42           ` Serge Fantino
1998-10-09 13:12             ` Sylvain BOULM'E
1998-10-07 10:16     ` porte des definitions " Sylvain BOULM'E
1998-10-08  7:33       ` Jacques GARRIGUE

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=19981007232533.54502@pauillac.inria.fr \
    --to=jerome.vouillon@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=fantino@math.unice.fr \
    --cc=vyskocil@math.unice.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).