Exemplo de padrão “Pimp My Library” de Scala

Sempre me vejo querendo encontrar um exemplo rápido disso para mostrar às pessoas. Essencialmente, o padrão “Pimp My Library” permite decorar classes com métodos e propriedades adicionais. Veja a seguir como você adicionaria um método “bling” a java.lang.String, que adicionaria asteriscos em qualquer uma das extremidades:

class BlingString(string: String) {
def bling = "*" + string + "*"
}

implicit def blingYoString(string: String) = new BlingString(string)

Isso define uma classe BlingString com o método bling e, em seguida, usa uma definição implícita para “ensinar” o Scala como converter de java.lang.String para o novo tipo. Você pode então chamar o método em qualquer objeto java.lang.String, desde que o implícito seja definido no mesmo escopo:

scala> "Let's get blinged out!".bling
res0
: java.lang.String = *Let's get blinged out!*