k47.cz
výběr kolo foto makro povídky kultura
koronavirus TECH ▞▞ | twitter RSS

Scala - operátor mocniny

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

V ně­kte­rých ja­zy­cích je pří­to­men ope­rá­tor moc­niny (ob­vykle '**' nebo ^). Scala ho nemá, ale jako všechno ostatní se dá snadno do­pl­nit.


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 jed­no­dušší. Stačí přímo použít extension metody. Navíc můžeme přidat klí­čové slovo inline. To za­jistí, že tělo metody ** je vždy plně in­li­no­vá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ě pro­vede to samé, nicméně jde o pří­jemný bonus, kdy máme ga­ranci, že abs­trakce byla eli­mi­no­vána.

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