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?
Respostas:
quando você estiver usando o ActiveSupport, há user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F , para verificar apenas se não for nulo, por que não usar
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
Você parece excessivamente preocupado com booleanos.
def logged_in?
user
end
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:
def logged_in?
user.present?
end
?
é que ele retorne um booleano. !!value
é a maneira clássica de converter qualquer coisa em booleano. Não é exatamente o mesmo, mas neste caso Object#present?
em RoR também é bom.
Cuidado com as outras respostas apresentadas present?
como uma resposta à sua pergunta.
present?
é o oposto de blank?
em trilhos.
present?
verifica se há um valor significativo. Essas coisas podem falhar em uma present?
verificação:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
Considerando que um !nil?
cheque dá:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
verifica se um objeto é realmente nil
. Qualquer outra coisa: uma cadeia vazia, 0
, false
, qualquer que seja, não é nil
.
present?
é muito útil, mas definitivamente não é o oposto de nil?
. Confundir os dois pode levar a erros inesperados.
Pois o seu caso de uso present?
funcionará, mas é sempre bom estar ciente da diferença.
false.blank?
não é o mesmo quefalse.nil?
Talvez esta seja uma abordagem:
class Object
def not_nil?
!nil?
end
end
!self.nil?
antes !nil?
ou está self
implícito?
Você pode apenas usar o seguinte:
if object
p "object exists"
else
p "object does not exist"
end
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.
Posso oferecer o !
método Ruby no resultado do nil?
método.
def logged_in?
user.nil?.!
end
Tão esotérico que o IDE RubyMine irá sinalizar como um erro. ;-)
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; Acho arr.find(&:not_nil?)
um pouco mais legível do que arr.find { |e| !e.nil? }
.
O método que encontrei é Object#itself
. No meu uso, eu queria encontrar o valor em um hash para a chave name
, onde em alguns casos essa chave foi acidentalmente capitalizada como Name
. Esse one-liner é o seguinte:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Conforme observado em outras respostas , isso falhará espetacularmente nos casos em que você estiver testando um booleano.
my_hash.values_at("Name", "name").find
?
map
que removi para simplificar neste exemplo, então como está escrito aqui é intercambiável com values_at
. A parte importante é o que é passado find
.
present?
requer uma string não em branco.! "".nil?
retorna verdadeiro, mas"".present?
retorna falso.