Я не разбираюсь в Ruby, поэтому мой код кажется «уродливым» и не идиоматическим:
def logged_in?
!user.nil?
end
Я бы предпочел что-то вроде
def logged_in?
user.not_nil?
end
Но не могу найти такой метод, который бы противоречил nil?
ruby-on-rails
ruby
null
Berkes
источник
источник
present?
требуется непустая строка.! "".nil?
возвращает истину, но"".present?
возвращает ложь.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
.