É "apenas adoçar" para facilitar a leitura, mas eles têm significados comuns:
Os métodos que terminam em !realizam alguma mudança permanente ou potencialmente perigosa ; por exemplo:
Enumerable#sortretorna uma versão classificada do objeto enquanto o Enumerable#sort!classifica no lugar.
No Rails, ActiveRecord::Base#saveretorna falso se o salvamento falhar, enquanto ActiveRecord::Base#save!gera uma exceção.
Kernel::exitfaz com que um script saia, enquanto o Kernel::exit!faz imediatamente, ignorando quaisquer manipuladores de saída.
Os métodos que terminam em ?retornar um booleano , o que faz o código fluir ainda mais intuitivamente como uma frase - if number.zero?parece "se o número for zero", mas if number.zeroparece estranho.
Em seu exemplo, name.reverseavalia como uma string invertida, mas somente após a name.reverse!linha a namevariável realmente contém o nome invertido. name.is_binary_data?parece "são namedados binários?".
Uma observação importante é que você só deve ter um método bang se também tiver um método não bang correspondente. O estrondo é usado para distinguir a versão "mais surpreendente" do método da "menos surpreendente". Se você tiver apenas um método, não há necessidade de fazer distinção e não deve nomeá-lo com estrondo. Veja Array#clear, por exemplo. Ele limpa a matriz. Limpar a matriz altera-a naturalmente. Não há nada de surpreendente nisso, o nome já deixa claro, portanto: sem estrondo. Consulte ruby-forum.com/topic/176830#773946 .
Jörg W Mittag
2
Adicionando ao que @ JörgWMittag declarou, de acordo com o Guia de Estilo Ruby : Os nomes de métodos potencialmente perigosos (ou seja, métodos que modificam a si mesmo ou os argumentos, exit! (Não executa os finalizadores como o exit faz), etc.) devem terminar com um ponto de exclamação se houver uma versão segura desse método perigoso .
Tod Birdsall
2
Cuidado, nem sempre é esse o caso. Por exemplo, Ruby Array # concat docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat . Onde você pode se queimar gravemente é algo como MyActiveRecordModel.column_names.concat (...). Em vez disso, você deve cloná-lo antes de fazer o concat.
wintondeshong
15
O ponto de interrogação indica que o método retorna booleano. Já respondi aqui:
Em Ruby, ?significa que o método irá retornar um booleano e !modificar o objeto no qual foi chamado. Eles existem para melhorar a legibilidade ao examinar o código.
Em contraste com a - suponho - maioria das linguagens de programação ...
Ruby, os métodos podem terminar com pontos de interrogação ou exclamação.
Por convenção, os métodos que respondem às perguntas (ou seja, Array # empty? Retorna true se o receptor estiver vazio) terminam em pontos de interrogação.
Métodos potencialmente “perigosos” (isto é, métodos que modificam a si mesmo ou os argumentos, saída! Etc.) por convenção terminam com pontos de exclamação.
Onde você pode se queimar seriamente é algo como MyActiveRecordModel.column_names.concat([url]) . Chamadas posteriores relacionadas a MyActiveRecordModel tentarão procurar uma coluna de 'url' para MyActiveRecordModel e lançar.
Em vez disso, você deve cloná-lo antes de fazer o concat. Felizmente meu conjunto de testes pegou esse, mas ... atenção!
Respostas:
É "apenas adoçar" para facilitar a leitura, mas eles têm significados comuns:
!
realizam alguma mudança permanente ou potencialmente perigosa ; por exemplo:Enumerable#sort
retorna uma versão classificada do objeto enquanto oEnumerable#sort!
classifica no lugar.ActiveRecord::Base#save
retorna falso se o salvamento falhar, enquantoActiveRecord::Base#save!
gera uma exceção.Kernel::exit
faz com que um script saia, enquanto oKernel::exit!
faz imediatamente, ignorando quaisquer manipuladores de saída.?
retornar um booleano , o que faz o código fluir ainda mais intuitivamente como uma frase -if number.zero?
parece "se o número for zero", masif number.zero
parece estranho.Em seu exemplo,
name.reverse
avalia como uma string invertida, mas somente após aname.reverse!
linha aname
variável realmente contém o nome invertido.name.is_binary_data?
parece "sãoname
dados binários?".fonte
Array#clear
, por exemplo. Ele limpa a matriz. Limpar a matriz altera-a naturalmente. Não há nada de surpreendente nisso, o nome já deixa claro, portanto: sem estrondo. Consulte ruby-forum.com/topic/176830#773946 .O ponto de interrogação indica que o método retorna booleano. Já respondi aqui:
O que o operador ponto de interrogação significa em Ruby?
O estrondo indica que o método atua no próprio objeto. Já respondi aqui:
Por que os pontos de exclamação são usados nos métodos Ruby?
fonte
Em Ruby,
?
significa que o método irá retornar um booleano e!
modificar o objeto no qual foi chamado. Eles existem para melhorar a legibilidade ao examinar o código.fonte
Em contraste com a - suponho - maioria das linguagens de programação ...
De: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Section Funny method names
fonte
?
são chamados de métodos de predicado.Cuidado, nem sempre é esse o caso. Veja, por exemplo, Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Onde você pode se queimar seriamente é algo como
MyActiveRecordModel.column_names.concat([url])
. Chamadas posteriores relacionadas a MyActiveRecordModel tentarão procurar uma coluna de 'url' para MyActiveRecordModel e lançar.Em vez disso, você deve cloná-lo antes de fazer o concat. Felizmente meu conjunto de testes pegou esse, mas ... atenção!
fonte