Я не разбираюсь в Ruby, поэтому мой код кажется «уродливым» и не идиоматическим:
def logged_in?
!user.nil?
end
Я бы предпочел что-то вроде
def logged_in?
user.not_nil?
end
Но не могу найти такой метод, который бы противоречил nil?
Ответы:
когда вы используете ActiveSupport, есть user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F , чтобы проверить только ненулевое значение, почему бы не использовать
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
Вы, кажется, слишком озабочены логическими значениями.
def logged_in?
user
end
Если пользователь равен нулю, тогда logged_in? вернет значение "ложь". В противном случае он вернет объект. В Ruby нам не нужно возвращать истину или ложь, поскольку у нас есть «истинные» и «ложные» значения, как в JavaScript.
Обновить
Если вы используете Rails, вы можете сделать это лучше, используя present?
метод:
def logged_in?
user.present?
end
?
, вернет логическое значение. !!value
это классический способ преобразовать что угодно в логическое значение. Не совсем то же самое, но в данном случае Object#present?
в RoR тоже хорошо.
Остерегайтесь представления других ответов present?
как ответ на ваш вопрос.
present?
противоположен blank?
рельсам.
present?
проверяет, есть ли значимое значение. Эти вещи могут не пройти present?
проверку:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
А !nil?
чек дает:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
проверяет, есть ли объект на самом деле nil
. Что - нибудь еще: пустая строка, 0
,false
, что угодно, не nil
.
present?
очень полезно, но определенно не наоборот nil?
. Их смешение может привести к неожиданным ошибкам.
Для вашего present?
варианта использования будет работать, но всегда полезно знать разницу.
false.blank?
не то же самое, чтоfalse.nil?
present?
будет запрашивать вашу базу данных, nil?
не будьте осторожны с этим
Возможно, это может быть подход:
class Object
def not_nil?
!nil?
end
end
!self.nil?
а потом !nil?
, или self
неявный?
Вы можете просто использовать следующее:
if object
p "object exists"
else
p "object does not exist"
end
Это работает не только для nil, но и для false и т. Д., Поэтому вам следует проверить, работает ли это в вашем случае использования.
Могу я предложить метод Ruby-esque !
для результата этого nil?
метода.
def logged_in?
user.nil?.!
end
Настолько эзотерично, что RubyMine IDE отметит это как ошибку. ;-)
Я подошел к этому вопросу, ища метод объекта, чтобы я мог использовать Symbol#to_proc
сокращение вместо блока; Я нахожу arr.find(&:not_nil?)
более читаемым, чем arr.find { |e| !e.nil? }
.
Метод, который я нашел, есть Object#itself
. В моем использовании я хотел найти значение в хеше для ключа name
, где в некоторых случаях этот ключ был случайно написан как Name
. Этот однострочный текст выглядит следующим образом:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Как отмечалось в других ответах , это не сработает в тех случаях, когда вы тестируете логическое значение.
my_hash.values_at("Name", "name").find
?
map
которую я удалил для простоты в этом примере, поэтому, как здесь написано, она взаимозаменяема values_at
. Важная часть - это то, что передается find
.
present?
требуется непустая строка.! "".nil?
возвращает истину, но"".present?
возвращает ложь.