k47.cz  — každý den dokud se vám to nezačne líbit
foto Praha výběr povídky kultura
twitter FB RSS

Scala - metody ála Smalltalk

6. 2. 2011 — k47 (CC by-nc-sa) (♪)

Small­talk byl jedním z prv­ních ob­jek­tově ori­en­to­va­ných jazyků (po­chází z roku 1972, úplně prvním byla Simula z roku 1967) a spousta věcí v něm je od­lišná od sou­čas­ných jazyků. Na­pří­klad není za­lo­žen na zdro­jo­vých kódech, ale na vir­tu­ál­ním stroji.


Jednou z mnoha dal­ších zvlášt­ností je forma volání metod se dvěma a více pa­ra­me­try. V ja­zy­cích, které vy­chá­zejí z céčka, je nor­mální kon­vence jméno metody a pak v zá­vor­kách seznam pa­ra­me­trů od­dě­le­ných čár­kami. Je to kom­paktní, ale když je pa­ra­me­trů hodně, může v tom být zmatek. Ve Small­talku má metoda tolik částí kolik je pa­ra­me­trů a vypadá to tak, že je každý ar­gu­ment patří jiné metodě.

Takže na­pří­klad v Rectangle width: 100 height: 200 je width:height: jedna metoda.


Pokud se vám tento způsob z ně­ja­kého důvodu líbí, tak vězte, že se dá velice snadno re­a­li­zo­vat/si­mu­lo­vat ve Scale s mi­ni­mální syn­tak­tic­kou režií. Stačí do sebe vnořit ně­ko­lik ano­nym­ních ob­jektů.

object Rectangle {
  def width(w: Int) = new {
    def height(h: Int) = doSomeMagic(w, h)
  }
}

Pak můžeme volat:

Rectangle width 100 height 200

a je to per­fektně va­lidní kód, který dělá přesně to, co chcete.

Má to sla­binu, že metody widthheight spolu nejsou, na rozdíl od Small­talku, ne­od­dě­li­telně spjaty. Jde o dvě různé metody. Když za­vo­lám jenom width, do­stanu ne­do­kon­čený objekt, který se nedá použít k ničemu jinému než za­vo­lání metody height, aby vrátil kýžený vý­sle­dek. Další otáz­kou je overhead vy­tvo­ření ob­jektu, který stejně hned za­nikne, ale dou­fejme, že tohle za nás vyřeší JVM.

Počet ar­gu­mentů sa­mo­zřejmě není ničím ome­zený, stačí do sebe za­no­řit víc ano­nym­ních ob­jektů (tedy tech­nicky vzato je ome­zený ve­li­kostí call­stacku, ale tento limit jsem ocho­ten ig­no­ro­vat).

píše k47 & hosté, ascii@k47.cz