Não tenho experiência em Ruby, então meu código parece "feio" e não idiomático:
def logged_in?
!user.nil?
end
Eu prefiro ter algo como
def logged_in?
user.not_nil?
end
Mas não consigo encontrar um método que opõe nil?
ruby-on-rails
ruby
null
Berkes
fonte
fonte
present?
requer uma string não em branco.! "".nil?
retorna verdadeiro, mas"".present?
retorna falso.false.present? == false
!false.nil? == true
Você parece excessivamente preocupado com booleanos.
Se o usuário for nulo, então conectado? retornará um valor "falsey". Caso contrário, ele retornará um objeto. Em Ruby, não precisamos retornar verdadeiro ou falso, uma vez que temos os valores "truthy" e "falsey" como em JavaScript.
Atualizar
Se você estiver usando Rails, você pode fazer isso de forma mais agradável usando o
present?
método:fonte
?
é que ele retorne um booleano.!!value
é a maneira clássica de converter qualquer coisa em booleano. Não é exatamente o mesmo, mas neste casoObject#present?
em RoR também é bom.Cuidado com as outras respostas apresentadas
present?
como uma resposta à sua pergunta.present?
é o oposto deblank?
em trilhos.present?
verifica se há um valor significativo. Essas coisas podem falhar em umapresent?
verificação:Considerando que um
!nil?
cheque dá:nil?
verifica se um objeto é realmentenil
. Qualquer outra coisa: uma cadeia vazia,0
,false
, qualquer que seja, não énil
.present?
é muito útil, mas definitivamente não é o oposto denil?
. Confundir os dois pode levar a erros inesperados.Pois o seu caso de uso
present?
funcionará, mas é sempre bom estar ciente da diferença.fonte
false.blank?
não é o mesmo quefalse.nil?
Talvez esta seja uma abordagem:
fonte
!self.nil?
antes!nil?
ou estáself
implícito?Você pode apenas usar o seguinte:
Isso não funciona apenas para nil, mas também para false etc., então você deve testar para ver se funciona em seu caso de uso.
fonte
Posso oferecer o
!
método Ruby no resultado donil?
método.Tão esotérico que o IDE RubyMine irá sinalizar como um erro. ;-)
fonte
Cheguei a esta questão procurando por um método de objeto, para que pudesse usar a
Symbol#to_proc
abreviação em vez de um bloco; Achoarr.find(&:not_nil?)
um pouco mais legível do quearr.find { |e| !e.nil? }
.O método que encontrei é
Object#itself
. No meu uso, eu queria encontrar o valor em um hash para a chavename
, onde em alguns casos essa chave foi acidentalmente capitalizada comoName
. Esse one-liner é o seguinte:Conforme observado em outras respostas , isso falhará espetacularmente nos casos em que você estiver testando um booleano.
fonte
my_hash.values_at("Name", "name").find
?map
que removi para simplificar neste exemplo, então como está escrito aqui é intercambiável comvalues_at
. A parte importante é o que é passadofind
.