No tengo experiencia en Ruby, por lo que mi código se siente "feo" y no idiomático:
def logged_in?
!user.nil?
end
Prefiero tener algo como
def logged_in?
user.not_nil?
end
Pero no puedo encontrar un método que se oponga nil?
ruby-on-rails
ruby
null
Berkes
fuente
fuente
present?
requiere una cadena que no esté en blanco.! "".nil?
devuelve verdadero, pero"".present?
devuelve falso.false.present? == false
!false.nil? == true
Parece demasiado preocupado por los valores booleanos.
def logged_in? user end
Si el usuario es nulo, entonces log_in? devolverá un valor "falsey". De lo contrario, devolverá un objeto. En Ruby no necesitamos devolver verdadero o falso, ya que tenemos valores de "verdadero" y "falso" como en JavaScript.
Actualizar
Si está usando Rails, puede hacer que esto se lea mejor usando el
present?
método:def logged_in? user.present? end
fuente
?
es que devuelva un booleano.!!value
es la forma clásica de convertir cualquier cosa a booleana. No es exactamente lo mismo, pero en este casoObject#present?
en RoR también es bueno.Tenga cuidado con otras respuestas que se presentan
present?
como una respuesta a su pregunta.present?
es lo contrario deblank?
en rieles.present?
comprueba si hay un valor significativo. Estas cosas pueden fallar en unapresent?
verificación:"".present? # false " ".present? # false [].present? # false false.present? # false YourActiveRecordModel.where("false = true").present? # false
Mientras que un
!nil?
cheque da:!"".nil? # true !" ".nil? # true ![].nil? # true !false.nil? # true !YourActiveRecordModel.where("false = true").nil? # true
nil?
comprueba si un objeto es realmentenil
. Cualquier otra cosa: una cadena vacía,0
,false
, lo que sea, no esnil
.present?
es muy útil, pero definitivamente no es lo contrario denil?
. Confundir los dos puede provocar errores inesperados.Porque su caso de uso
present?
funcionará, pero siempre es aconsejable ser consciente de la diferencia.fuente
false.blank?
no es lo mismo quefalse.nil?
present?
consultará su base de datos,nil?
no, tenga cuidado con esoQuizás este podría ser un enfoque:
class Object def not_nil? !nil? end end
fuente
!self.nil?
más bien entonces!nil?
, o estáself
implícito?Puedes usar lo siguiente:
if object p "object exists" else p "object does not exist" end
Esto no solo funciona para nil sino también falso, etc., por lo que debe probar para ver si funciona en su caso de uso.
fuente
¿Puedo ofrecer el
!
método Ruby-esque sobre el resultado delnil?
método?def logged_in? user.nil?.! end
Tan esotérico que RubyMine IDE lo marcará como un error. ;-)
fuente
Llegué a esta pregunta buscando un método de objeto, para poder usar la
Symbol#to_proc
taquigrafía en lugar de un bloque; Encuentroarr.find(&:not_nil?)
algo más legible quearr.find { |e| !e.nil? }
.El método que encontré es
Object#itself
. En mi uso, quería encontrar el valor en un hash para la clavename
, donde en algunos casos esa clave se capitalizó accidentalmente comoName
. Esa frase es la siguiente:# Extract values for several possible keys # and find the first non-nil one ["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Como se señaló en otras respuestas , esto fallará espectacularmente en los casos en que esté probando un booleano.
fuente
my_hash.values_at("Name", "name").find
?map
que eliminé por simplicidad en este ejemplo, así que como está escrito aquí es intercambiablevalues_at
. La parte importante es a lo que se le pasafind
.