Pergunta

Eu sou novo para Ruby e recentemente correu para um problema comparando com os valores ao criar um aplicativo Ruby on Rails. Em um controlador eu tinha a seguinte declaração que sempre retornou false:

if (user.id != params[:id])

O problema foi o user.id (que é um Active Record) é um inteiro e params [: id] é uma string. Levei um tempo para descobrir isso e eu finalmente mudou para:

if (user.id != params[:id].to_i)

Agora, a instrução funciona como esperado.

Para evitar esse erro no futuro é Existe uma maneira de "compilação" ou obter Ruby para avisá-lo se você tentar comparar 2 tipos diferentes? Algumas outras questões Corri Já em que eu gostaria de "verificação de compilação" são:

  • Avisar-me se eu criar uma variável, mas não usá-lo. Para verificação ajuda para erros de digitação em nomes de variáveis.
  • Certifique-se de um método existe em uma classe para que eu possa evitar erros de digitação nome do método e também para ajudar refactoring, por exemplo, se eu mudar o nome de um método.

Atualmente estou usando Ruby 1.8.6-27 RC2 com Rails 2.3.2 e RadRails IDE no Windows.

Foi útil?

Solução 6

A melhor solução que eu encontrei foi uma IDE que fez on-the-fly verificação de sintaxe, como RubyMine. Eu não tenho certeza se ele teria resolvido meu problema original, mas me ajudou a encontrar e corrigir vários outros erros de sintaxe e compilar. Obrigado a todos por suas sugestões.

Outras dicas

Test primeiro, código, em seguida. Se você escrever testes que abrangem todos os ramos de sua aplicação, você tem a garantia de que o seu código de ambos corre e produz resultados corretos.

EDIT: Gostaria de salientar que a capacidade de comparar dois tipos, não depende de nomes de métodos até o último segundo, etc, são os principais recursos de Ruby.

Você não chamar um método muito como você enviar uma mensagem para um objeto. O objeto é responsável por descobrir como lidar com o método. No Rails este é usado para acessar as colunas DB em ActiveRecord. Não há métodos para as colunas até que uma mensagem com o nome da coluna é enviado para o objeto.

estática digitação em Ruby vai contra o sistema de pato digitação. Um pode muitas vezes obter polimorfismo para livre sem se preocupar com esquemas de herança / interface complexa.

Eu sugiro abraçar esses recursos e compensar a incerteza por meio de testes

Ruby não permitem que você redefinir o == operador para objeto. Em Ruby 1.8 você não pode, Ruby 1.9 era suposto fazer, mas eu não tenho sido capaz de obter o meu script de trabalho para classes principais. Ele funciona bem para objetos definidos personalizados.

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

Supondo que eu não fiz algum erro de codificação estúpido, a resposta é NÃO:. Você não pode verificar se você está comparando diferentes tipos de objetos

Além disso, eu diria que não. Na verdade Ruby não é projetado para funcionar desta forma, esta é mais uma abordagem java em vez de estilo Ruby.

Ruby não é suposto para ser seguro. Ele permite que você comparar dois objetos, e que é onde muito do seu poder vem. Rails não seria possível sem esse design dinâmico.

Mesmo uma linguagem compilada como Java ou C não vai impedi-lo de fazer == em dois objetos. Como Ben disse, é melhor testar primeiro. Inspecionar as estruturas que você está trabalhando. Uma maneira de obter informações sobre um objeto Ruby é usar:

puts object.class

Em geral, a melhor maneira (que eu saiba) para evitar este tipo de problema para linguagens dinâmicas / script é mover "lógica" para métodos / comandos e testes unitários escrever para eles. Basicamente, qualquer coisa que pode falhar devem ser testados. O código na página deve ser lógica burra ... em vez de exibir apenas os itens que atendem a determinados critérios, ele deve exibir todos os itens, e obter essa lista de itens a partir de um método que retorna apenas os que devem ser exibidos.

Duas coisas que eu sugiro:

Um: Leia-se sobre IRB (ou script / console para trilhos). Uma prática comum de desenvolvimento em linguagens dinâmicas é experimentar trechos de código dentro de um intérprete "ao vivo" (como IRB ou o console Rails). Esta prática remonta aos primeiros linguagens dinâmicas como Smalltalk e Lisp. Ruby-debug também é muito útil para solucionar problemas e teria sido realmente uma maneira fácil de descobrir o erro no seu exemplo.

Dois: Leia-se sobre "Typing Duck". "Tipos" e variáveis ??trabalhar um pouco diferente em Ruby do que muitas pessoas esperam que eles. Pelo que entendi, uma variável como user.id não tem um "tipo". O valor apontou para por user.id tem um tipo, mas a variável em si não faz. Eu acredito que isso é parte da razão pela qual não há nenhuma ferramenta que teria lhe dito que seu erro foi antes de executar o programa. Comparando essas duas variáveis ??não é um erro, pois as variáveis ??não têm um tipo. user.id estava apontando para um inteiro naquele ponto em seu programa, mas seria perfeitamente legal para atribuir user.id para apontar para uma string, em que ponto essa comparação teria feito muito mais sentido. : -)

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