k47.cz
mastodon twitter RSS
bandcamp explorer

Scala - operátor mocniny

21. 12. 2010 (aktualizováno 30. 5. 2021) — k47 (CC by)

V některých jazycích je přítomen operátor mocniny (obvykle '**' nebo ^). Scala ho nemá, ale jako všechno ostatní se dá snadno doplnit.


class Powable(val v: Double) {
  def **(exp: Double) = Math.pow(v, exp)
}

implicit def doubleToPowable(v: Double) = new Powable(v);

// test:
10 ** 3    // ekvivalent k Math.pow(10, 3)
1.1 ** 1.1
'a' ** 'b' // funguje na všech numerických typech (i na Char)

Ve Scale 3 je to o něco jednodušší. Stačí přímo použít extension metody. Navíc můžeme přidat klíčové slovo inline. To zajistí, že tělo metody ** je vždy plně inlinováno a všude se místo něj volá přímo metoda Math.pow. V tomto případě nejde o velkou výhru, JIT téměř jistě provede to samé, nicméně jde o příjemný bonus, kdy máme garanci, že abstrakce byla eliminována.

extension (d: Double) {
  inline def ** (exp: Double) = Math.pow(d, exp)
}
píše k47, ascii@k47.cz