Em Ruby, alguns métodos têm um ponto de interrogação ( ?
) que faz uma pergunta como include?
essa e pergunta se o objeto em questão está incluído; isso retorna um verdadeiro / falso.
Mas por que alguns métodos têm pontos de exclamação ( !
), enquanto outros não?
O que isso significa?
Respostas:
Em geral, os métodos que terminam
!
indicam que o método modificará o objeto em que é chamado . Ruby os chama de " métodos perigosos " porque eles mudam de estado ao qual outra pessoa pode ter uma referência. Aqui está um exemplo simples para strings:Isso produzirá:
Nas bibliotecas padrão, há muitos lugares em que você verá pares de métodos com nomes semelhantes, um com
!
e outro sem. Os que estão sem são chamados de "métodos seguros" e retornam uma cópia do original com as alterações aplicadas à cópia , com o chamado inalterado. Aqui está o mesmo exemplo sem o!
:Isso gera:
Lembre-se de que isso é apenas uma convenção, mas muitas classes de Ruby a seguem. Também ajuda a acompanhar o que está sendo modificado no seu código.
fonte
save
esave!
naActiveRecord
O ponto de exclamação significa muitas coisas e, às vezes, você não pode dizer muita coisa além de "isso é perigoso, tenha cuidado".
Como outros já disseram, em métodos padrão, é freqüentemente usado para indicar um método que faz com que um objeto se mude, mas nem sempre. Note-se que muitos métodos padrão mudar seu receptor e não tem um ponto de exclamação (
pop
,shift
,clear
), e alguns métodos com pontos de exclamação não mudam seu receptor (exit!
). Veja este artigo por exemplo.Outras bibliotecas podem usá-lo de maneira diferente. No Rails, um ponto de exclamação geralmente significa que o método lançará uma exceção em caso de falha, em vez de falhar silenciosamente.
É uma convenção de nomes, mas muitas pessoas a usam de maneiras sutilmente diferentes. No seu próprio código, uma boa regra de ouro é usá-lo sempre que um método está fazendo algo "perigoso", especialmente quando existem dois métodos com o mesmo nome e um deles é mais "perigoso" que o outro. "Perigoso" pode significar quase qualquer coisa.
fonte
Esta convenção de nomenclatura é retirada do esquema .
fonte
! normalmente significa que o método atua sobre o objeto em vez de retornar um resultado. Do livro Programming Ruby :
fonte
É mais preciso dizer que os métodos com um Bang! são a versão mais perigosa ou surpreendente . Existem muitos métodos que mudam sem um Bang, como
.destroy
em geral os métodos têm apenas bangs onde existe uma alternativa mais segura na biblioteca principal.Por exemplo, em Array, temos
.compact
e.compact!
, ambos os métodos modificam a matriz, mas.compact!
retornam nulo em vez de self se não houver nulo na matriz, o que é mais surpreendente do que apenas retornar self.O único método não-mutante que encontrei com um estrondo é
Kernel
o.exit!
mais surpreendente do que.exit
porque você não pode pegarSystemExit
enquanto o processo está fechando.O Rails e o ActiveRecord continuam essa tendência, pois usam o bang para obter efeitos mais "surpreendentes", como o
.create!
que gera erros em caso de falha.fonte
Em themomorohoax.com:
Um estrondo pode ser usado das maneiras abaixo, em ordem de minha preferência pessoal.
O ponto é: use apenas um estrondo quando você realmente tiver pensado se é necessário, para salvar outros desenvolvedores do incômodo de verificar por que você está usando um estrondo.
O estrondo fornece duas pistas para outros desenvolvedores.
http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods
fonte
Explicação simples:
Mas se você já chamou um método
downcase!
na explicação acima,foo
mudaria para minúscula permanentemente.downcase!
não retornaria um novo objeto de sequência, mas substituiria a sequência no lugar, alterando totalmentefoo
para minúscula. Eu sugiro que você não use adowncase!
menos que seja totalmente necessário.fonte
Eu gosto de pensar nisso como uma mudança explosiva que destrói tudo o que passou antes dela. Bang ou ponto de exclamação significa que você está fazendo uma alteração salva permanente no seu código.
Se você usar, por exemplo, o método Ruby para substituição global,
gsub!
a substituição feita será permanente.Outra maneira que você pode imaginar é abrir um arquivo de texto e localizar e substituir, seguido pelo salvamento.
!
faz o mesmo no seu código.Outro lembrete útil, se você vem do mundo do bash,
sed -i
tem esse efeito semelhante de fazer alterações salvas permanentes.fonte
Chamados de "Métodos destrutivos" Eles tendem a alterar a cópia original do objeto ao qual você está se referindo.
fonte
Conclusão: os
!
métodos apenas alteram o valor do objeto em que são chamados, enquanto um método sem!
retorna um valor manipulado sem escrever sobre o objeto em que o método foi chamado.Use apenas
!
se você não planeja precisar o valor original armazenado na variável na qual você chamou o método.Eu prefiro fazer algo como:
OU
Ao invés de
Apenas no caso de eu gostaria de acessar o valor original novamente.
fonte
!
modifica o objeto em vez de retornar uma cópia modificada.User.create!