[nem-pl] Kolejne uwagi/pytania

Kamil Skalski nazgul at omega.pl
Sun Jun 20 22:19:15 CEST 2004


Sunday 20 June 2004 15:32, Wojtek Knapik wrote:
> On Sun, Jun 20, 2004 at 12:54:20PM +0200, Kamil Skalski wrote:
> > Saturday 19 June 2004 16:42, Wojtek Knapik wrote:
> > > 1. Mialem raz taka sytuacje, ze chcialem zrobic zmienna, ktorej wartosc
> > >    bylaby przypisywana tylko raz (ale nie w konstruktorze klasy, tylko
> > > w jednej z pozostalych metod), i miala byc do tego public. W efekcie
> > > bylem zmuszony zrobic ja mutable, a to juz nie bylo dokladnie to o co
> > > mi chodzilo.
> >
> > Tak, zdarzają się takie sytuacje, w szczególności jeśli jest specjalna
> > metoda Init, która powinna coś zapisywać i wywoływana jest później niż
> > konstruktor. Standardowe podejście do tego jest chyba takie, że pole
> > robisz prywatne i mutable, a dostęp z niego jest tylko przez property,
> > która jest readonly private mutable myX : int;
> > public X : int {
> >   get { myX }
> > }
> >
> > >    Jasne, mozna ja chronic ustawiajac jako private i udostepniajac
> > >    wartosc poprzez jakas metode, ale to juz nie jest takie ladne ;/
> > >    *Musi* tak byc ? Nie daloby sie tego zrobic jakos, zeby byla stala ?
> >
> > można też
> > public x : int = 5;
> >
> > ale to jest równoważne z dodaniem do konstruktora
> > this () {
> >  x = 5;
> > }
> >
> > Lepszej metody chyba nie ma, bo jak określisz, że akurat ta metoda może
> > zapisać do zmiennej, a inne nie mogą.
>
>  No to by bylo fatalnie ;/ Chcialbym pisac w Nemerle czysto
> funkcjonalnie, bez uzycia jakichkolwiek zmiennych, a w takiej sytuacji
> jest to niemozliwe.. Nie daloby sie tego zalatwic jakos po stronie
> kompilatora ? Bo w koncu wartosc tego pola ustalamy raz, wiec mogloby
> byc stala..

Może podasz przykład, w którym potrzebujesz tej opóźnionej inicjalizacji. Bo 
jak ja to widzę, to sam fakt, że chcesz inicjację jakieś zmiennej uzależnić 
od wywołania metody Init (której to wywołanie nie musi przecież nastąpić) 
jest bardzo imperatywnym zagraniem. W programowaniu funkcjonalnym każde 
stworzenie obiektu konstruuje go całkowicie i do końca, każde wywołanie 
funkcji na określonym parametrze zwróci ten sam wynik, itd.

Zauważ, że zawsze możesz mieć to pole np. typu option tworzone na początku 
jako None, a potem jak chcesz już coś tam mieć, to tworzysz nowy obiekt, 
który jest kopią tamtego, tylko na tym polu już ma Some ...

Kamil




More information about the devel-pl mailing list