Pergunta

Em Ruby alguns métodos têm um ponto de interrogação (?) que uma pergunta como include? que perguntar se o objeto em questão está incluído, este, em seguida, retorna um verdadeiro / falso.

Mas porque é que alguns métodos têm pontos de exclamação (!), onde outros não?

O que significa?

Foi útil?

Solução

Em geral, os métodos que terminam em ! indicam que o método modificar o objeto é chamado no . Rubi chama estes como " métodos perigosos ", porque eles mudam de estado que alguém pode ter uma referência. Aqui está um exemplo simples para strings:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

A saída será:

a string

Nas bibliotecas padrão, há um monte de lugares que você verá pares de métodos de nome semelhante, um com a ! e um sem. Os sem são chamados de "métodos seguros", e eles retornam uma cópia do original com as alterações aplicadas a a cópia , com o receptor inalterado. Aqui está o mesmo exemplo sem a !:

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

Esta saídas:

A STRING
a string

Tenha em mente esta é apenas uma convenção, mas um monte de classes Ruby segui-lo. Ele também ajuda a manter o controle do que está sendo modificado em seu código.

Outras dicas

Os meios de ponto de exclamação muitas coisas, e às vezes você não pode dizer muito com isso diferente de "isso é perigoso, tenha cuidado".

Como já foi dito, em métodos padrão é muitas vezes usado para indicar um método que faz com que um objeto para transformar-se, 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!). Consulte este artigo por exemplo.

Outras bibliotecas podem usá-lo de forma diferente. No Rails um ponto de exclamação, muitas vezes significa que o método irá lançar uma exceção em caso de falha ao invés de falhar silenciosamente.

É uma convenção de nomenclatura, mas muitas pessoas usá-lo de maneiras sutilmente diferentes. Em seu próprio código uma boa regra de polegar é usá-lo sempre que um método está fazendo algo "perigoso", especialmente quando dois métodos com o mesmo nome existe e um deles é mais "perigoso" do que o outro. "Dangerous" pode significar qualquer coisa quase embora.

Esta convenção de nomenclatura é levantada a partir Esquema .

1.3.5 Convenções de nomenclatura

Por convenção, os nomes de procedimentos que sempre retornam um valor booleano geralmente terminam em ``? ''. tais procedimentos são chamados predicados.

Por convenção, os nomes de procedimentos que os valores de armazenar na anteriormente locais alocados (ver secção 3.4) normalmente terminam em ``! ''. tais procedimentos são chamados de mutação procedimentos. De convenção, o valor devolvido por um procedimento de mutação é não especificado.

! normalmente significa que o método age sobre o objeto em vez de retornar um resultado. Do livro programação Ruby :

métodos que são "perigoso", ou modificar o receptor, pode ser nomeado com um arrasto "!".

De themomorohoax.com:

Um estrondo pode ser usado no abaixo maneiras, em ordem de minha preferência pessoal.

1) Um método de registro ativo gerará um erro se o método não faz o que diz que fará.

2) Um método de registro ativo salva o registro ou um método salva uma objecto (por exemplo, tira!)

3) Método A faz algo “extra”, como mensagens para algum lugar, ou faz alguma ação.

O ponto é: use somente um estrondo quando você realmente pensei sobre se é necessário, para salvar outros desenvolvedores o incómodo de ter de verificar por que você está usando um estrondo.

O estrondo fornece duas pistas para outros desenvolvedores.

1) que não é necessário para salvar o objeto depois de chamar a método.

2) quando você chamar o método, a db vai ser alterado.

http: // www .themomorohoax.com / 2009/02/11 / when-to-use-a-bang-de exclamação ponto de pós--rails-métodos

É mais correto dizer que os métodos com um estrondo! são os mais perigoso ou versão surpreendente. Existem muitos métodos que mutate sem um estrondo, como .destroy e em métodos gerais só tem franja onde existe uma alternativa mais segura no núcleo lib.

Por exemplo, na matriz temos .compact e .compact!, ambos os métodos de mutação da matriz, mas .compact! retorna nil em vez de auto se não houver nada de na matriz, o que é mais surpreendente do que apenas o retorno auto.

O método único não-mutação que eu encontrei com um estrondo é Kernel de .exit! que é mais surpreendente do que .exit porque você não pode pegar SystemExit enquanto o processo está se fechando.

Rails e ActiveRecord continua esta tendência em que ele usa para bater mais 'surpreender' efeitos como .create! que gera erros na fracasso.

Explicação simples:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

Mas se você já chamado de downcase! método na explicação acima, foo mudaria para downcase permanentemente. downcase! não iria retornar um novo objeto string, mas substituir a corda no lugar, mudando totalmente o foo para downcase. Eu sugiro que você não use downcase! a menos que seja absolutamente necessário.

!

Eu gosto de pensar nisso como uma mudança explosiva que destrói tudo o que aconteceu antes dela. Golpe ou ponto de exclamação significa que você está fazendo uma mudança salvo permanente em seu código.

Se você usar para o método de exemplo de Ruby para substituição substitutiongsub!the mundial que você faz é permanente.

Outra forma que você pode imaginar, está abrindo um arquivo de texto e fazendo localizar e substituir, seguido de poupança. ! faz o mesmo em seu código.

Outro lembrete útil se você vem do mundo do bash é sed -i tem esse efeito similar de fazer a mudança salvo permanente.

chamado de "métodos destrutivos" Eles tendem a mudar a cópia original do objeto que você está se referindo.

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

A linha inferior: métodos ! basta alterar o valor do objeto são chamados, enquanto que um método sem ! retorna um valor manipulado sem escrever sobre o objeto do método foi chamado.

Use apenas ! se você não planeja precisando o valor original armazenado na variável que você chamou o método on.

Eu prefiro fazer algo como:

foo = "word"
bar = foo.capitalize
puts bar

ou

foo = "word"
puts foo.capitalize

Em vez de

foo = "word"
foo.capitalize!
puts foo

Apenas no caso eu gostaria de acessar o valor original novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top