📎 Webclip
Um exemplo bacana de coerção em Ruby
Ruby trata operadores aritméticos como métodos, e isso permite redefinir o comportamento de classes próprias. O exemplo usa a classe Intervalo, criada a partir de minutos, para mostrar como to_s pode devolver uma string formatada e como + pode retornar um novo objeto sem alterar o original.
Fichamento#
- Operadores como +, -, * e / são métodos, o que torna possível redefinir seu comportamento em classes próprias.
- A classe Intervalo guarda minutos e expõe horas e minutos para representar o tempo como horas e resto.
- Definir to_s em Intervalo permite exibir o intervalo no formato esperado, em vez da representação padrão de Object.
- Usar sprintf melhora a saída para manter os minutos com duas casas.
- O método + pode ser definido em Intervalo para somar minutos e devolver um novo objeto.
- A adição preserva a imutabilidade do objeto original, porque retorna outro Intervalo.
- Ao somar dois Intervalos, Ruby tenta coerção porque Fixnum#+ não conhece Intervalo.
- O método coerce pode devolver dois objetos compatíveis para que a operação continue dentro de Fixnum#+.
- Ao devolver um par apropriado em coerce, a soma 30 + Intervalo passa a ser resolvida pela lógica de Intervalo#+.
- Para que o resultado final continue sendo um Intervalo, o método coerce pode inverter a operação e fazer Fixnum delegar a soma de volta para Intervalo.
- Para evitar que @minutos receba um valor não inteiro, o construtor converte minutos com to_i.
- A convenção de conversão para inteiro em Ruby envolve expor um método to_i, enquanto Fixnum já responde a esse método.
