Às vezes vejo métodos em Ruby que têm "?" e "!" no final deles, por exemplo:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Eu queria saber qual é o propósito deles? Eles são apenas um revestimento de sintaxe?
Às vezes vejo métodos em Ruby que têm "?" e "!" no final deles, por exemplo:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Eu queria saber qual é o propósito deles? Eles são apenas um revestimento de sintaxe?
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 o Enumerable#sort!
classifica no lugar.ActiveRecord::Base#save
retorna falso se o salvamento falhar, enquanto ActiveRecord::Base#save!
gera uma exceção.Kernel::exit
faz com que um script saia, enquanto o Kernel::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", mas if number.zero
parece estranho.Em seu exemplo, name.reverse
avalia como uma string invertida, mas somente após a name.reverse!
linha a name
variável realmente contém o nome invertido. name.is_binary_data?
parece "são name
dados binários?".
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?
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.
De: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , Section Funny method names
?
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!