Scala - metody ála Smalltalk

Smalltalk byl jedním z prvních objektově orientovaných jazyků (pochází z roku 1972, úplně prvním byla Simula z roku 1967) a spousta věcí v něm je odlišná od současných jazyků. Například není založen na zdrojových kódech, ale na virtuálním stroji.
Jednou z mnoha dalších zvláštností je forma volání metod se dvěma a více parametry. V jazycích, které vycházejí z céčka, je normální konvence jméno metody a pak v závorkách seznam parametrů oddělených čárkami. Je to kompaktní, ale když je parametrů hodně, může v tom být zmatek. Ve Smalltalku má metoda tolik částí kolik je parametrů a vypadá to tak, že je každý argument patří jiné metodě.
Takže například v Rectangle width: 100 height: 200
je width:height:
jedna metoda.
Pokud se vám tento způsob z nějakého důvodu líbí, tak vězte, že se dá velice snadno realizovat/simulovat ve Scale s minimální syntaktickou režií. Stačí do sebe vnořit několik anonymních objektů.
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 perfektně validní kód, který dělá přesně to, co chcete.
Má to slabinu, že metody width
a height
spolu nejsou, na rozdíl od Smalltalku, neoddělitelně spjaty. Jde o dvě různé metody. Když zavolám jenom width
, dostanu nedokončený objekt, který se nedá použít k ničemu jinému než zavolání metody height
, aby vrátil kýžený výsledek. Další otázkou je overhead vytvoření objektu, který stejně hned zanikne, ale doufejme, že tohle za nás vyřeší JVM.
Počet argumentů samozřejmě není ničím omezený, stačí do sebe zanořit víc anonymních objektů (tedy technicky vzato je omezený velikostí callstacku, ale tento limit jsem ochoten ignorovat).