Como posso verificar se uma variável está definida no Ruby? Existe um isset
método -type disponível?
ruby
reflection
Somente leitura
fonte
fonte
nil
é inicializada.||=
operador) abaixo.defined?
ainda retornará true para uma variável definida dentro desse bloco!defined?
esse retorna booleano?!!defined?(object_name)
Isso é útil se você não quiser fazer nada, se existir, mas criá-lo, se não existir.
Isso cria apenas a nova instância uma vez. Depois disso, ele continua retornando o var.
fonte
||=
com valores booleanos, para que você não sinta a dor da confusão.nil
bem menos que você realmente quer para avaliar a expressão cada vez que é chamado quando ele retornarnil
var = (var or var.nil?)
A sintaxe correta para a instrução acima é:
substituindo (
var
) por sua variável. Essa sintaxe retornará um valor verdadeiro / falso para avaliação na instrução if.fonte
defined?(var) == nil
?.nil?
é mais idiomático, como eles dizem. É mais "orientado a objetos" perguntar a um objeto se elenil
do que usar um operador de comparação. Não é difícil ler, portanto, use o que for necessário para enviar mais produtos.defined?(your_var)
vai funcionar. Dependendo do que você está fazendo, você também pode fazer algo comoyour_var.nil?
fonte
your_var.nil?
porque retorna true de false e é muito melhor ler e escrever do quedefined? var
. Obrigado por isso.your_var.nil?
resultará em erro:undefined local variable or method your_var
quando não definido antes ...Tente "a menos que" em vez de "se"
fonte
Use
defined? YourVariable
Mantenha-o simples, bobo ..;)
fonte
Aqui está algum código, nada de ciência de foguetes, mas funciona bem o suficiente
Claramente, o código de coloração não é necessário, apenas uma boa visualização neste exemplo de brinquedo.
fonte
nil?
é opcional.AVISO Re: Um Padrão Ruby Comum
Esta é a resposta principal: o
defined?
método A resposta aceita acima ilustra isso perfeitamente.Mas há um tubarão, escondido sob as ondas ...
Considere este tipo de padrão ruby comum:
method2
sempre retornanil
. A primeira vez que você chamamethod1
, a@x
variável não está definida - portantomethod2
, será executada. emethod2
será definido@x
comonil
. Tudo bem, tudo muito bem. Mas o que acontece na segunda vez que você ligamethod1
?Lembre-se de que @x já foi definido como nulo.
But method2
ainda será executado novamente !! Se o método2 for um empreendimento caro, isso pode não ser o desejado.Deixe o
defined?
método ajudar - com esta solução, esse caso específico é tratado - use o seguinte:O diabo está nos detalhes: mas você pode escapar desse tubarão à espreita com o
defined?
método.fonte
Podes tentar:
Porque retorna um valor booleano.
fonte
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
declaração parece muito complicadoComo muitos outros exemplos mostram, você realmente não precisa de um booleano de um método para fazer escolhas lógicas em ruby. Seria uma forma ruim coagir tudo a um booleano, a menos que você realmente precise de um booleano.
Mas se você absolutamente precisa de um booleano. Usar !! (bang bang) ou "falsy falsy revela a verdade".
Por que geralmente não vale a pena coagir:
Aqui está um exemplo em que isso é importante porque se baseia na coerção implícita do valor booleano à sua representação de string.
fonte
Deve-se mencionar que usar
defined
para verificar se um campo específico está definido em um hash pode se comportar inesperadamente:A sintaxe está correta aqui, mas
defined? var['unknown']
será avaliada para a sequência"method"
, para que oif
bloco seja executadoedit: A notação correta para verificar se existe uma chave em um hash seria:
fonte
Observe a distinção entre "definido" e "atribuído".
x é definido mesmo que nunca seja atribuído!
fonte
NameError Exception: undefined local variable or method
e fiquei confuso quando a única atribuição / menção da variável estava em um bloco if que não estava sendo atingido.Além disso, você pode verificar se ele está definido enquanto está em uma string por interpolação, se você codificar:
O sistema informará o tipo, se estiver definido. Se não estiver definido, retornará apenas um aviso dizendo que a variável não foi inicializada.
Espero que isto ajude! :)
fonte
defined?
é ótimo, mas se você estiver em um ambiente Rails, também poderá usá-lotry
, especialmente nos casos em que deseja verificar o nome de uma variável dinâmica:fonte