У меня нет опыта в Ruby, поэтому мой код выглядит "уродливым", а не идиоматичным:
def logged_in?
!user.nil?
end
Я бы предпочел что-то вроде
def logged_in?
user.not_nil?
end
Но не может найти такой метод, который противопоставляет nil?
У меня нет опыта в 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, чтобы проверить только для non-nil, почему бы не использовать
def logged_in?
user # or !!user if you really want boolean's
end
Вы, похоже, слишком озабочены булевыми.
def logged_in?
user
end
Если пользователь равен нулю, то logged_in? вернет значение "ложное". В противном случае он вернет объект. В Ruby нам не нужно возвращать true или false, поскольку мы имеем "правдивые" и "ложные" значения, как в JavaScript.
Обновление
Если вы используете Rails, вы можете сделать это лучше, используя метод present?
:
def logged_in?
user.present?
end
Возможно, это может быть подход:
class Object
def not_nil?
!nil?
end
end
Остерегайтесь других ответов, представляющих 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?
будет работать, но всегда разумно осознавать разницу.
Вы можете использовать только следующее:
if object
p "object exists"
else
p "object does not exist"
end
Это работает не только для nil, но и для флагов и т.д., поэтому вы должны проверить, не работает ли это в вашей usecase.
Я пришел к этому вопросу в поисках метода объекта, чтобы я мог использовать сокращение Symbol#to_proc
вместо блока; Я считаю arr.find(&:not_nil?)
Несколько более читабельным, чем arr.find { |e| !e.nil? }
arr.find { |e| !e.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)
Как отмечалось в других ответах, это не получится эффектно в тех случаях, когда вы тестируете логическое значение.
Могу я предложить Ruby-esque !
метод на результат с nil?
метод.
def logged_in?
user.nil?.!
end
Настолько эзотерично, что RubyMine IDE помечает это как ошибку. ;-)