Os métodos bang(!) têm como funcionalidade alterar o próprio objeto ao mesmo tempo que aplicam sua função principal, sem ter a necessidade de retornar uma cópia do objeto modificado. Os métodos bang(!) são identificados pela exclamação após o seu nome.
Quando estamos desenvolvendo, é muito comum guardar o retorno de um método dentro de uma variável. Veja o código abaixo:
numeros = [1, 3, 4, 2, 20, 10, 16]
resultado = numeros.select { |numero| numero > 3 }
print resultado # => [4, 20, 10, 16]
Nesse exempo usamos o método select
para selecionar apenas os números maiores que 3 e guardamos os valores dentro da variável resultado.
Usando o método select!, podemos descartar a variável resultado, pois ele irá fazer a alteração no próprio objeto numeros
:
numeros = [1, 3, 4, 2, 20, 10, 16]
numeros.select! { |numero| numero > 3 }
print numeros # => [4, 20, 10, 16]
Com métodos bang(!) podemos parar de criar variáveis sem necessidade. 😁 Mas é importante lembrar que eles são destrutivos e substituem os dados originais dos objetos em que agem.
Em Ruby também existem muitos outros métodos bang(!) como: map!
, reverse!
, rotate!
, shuffle!
ou sort_by!
, e você pode conferir na documentação ou nos links a seguir.