Есть ли Ruby или Ruby-ism для not_nil?противоположность нулю?метод? - PullRequest
79 голосов
/ 25 октября 2010

У меня нет опыта работы с Ruby, поэтому мой код кажется "уродливым" и не идиоматичным:

def logged_in?
  !user.nil?
end

Я бы предпочел что-то вроде

def logged_in?
  user.not_nil?
end

Но не могу найти такоеметод, который противоположен nil?

Ответы [ 7 ]

48 голосов
/ 25 октября 2010

Вы, похоже, слишком озабочены булевыми значениями.

def logged_in?
  user
end

Если пользователь ноль, то logged_in? вернет значение "фальси". В противном случае он вернет объект. В Ruby нам не нужно возвращать true или false, так как у нас есть значения truey и falsey, как в JavaScript.

Обновление

Если вы используете Rails, вы можете сделать это более удобным, используя метод present?:

def logged_in?
  user.present?
end
48 голосов
/ 25 октября 2010

когда вы используете 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
15 голосов
/ 28 июля 2017

Остерегайтесь других ответов, представляя 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? будет работать, но всегда разумно осознавать разницу.

15 голосов
/ 25 октября 2010

Может быть, это может быть подход:

class Object
  def not_nil?
    !nil?
  end
end
4 голосов
/ 25 октября 2010

Вы можете просто использовать следующее:

if object
  p "object exists"
else
  p "object does not exist"
end

Это работает не только для nil, но также для false и т. Д., Поэтому вам следует проверить, работает ли оно в вашем случае использования.

1 голос
/ 02 мая 2019

Я пришел к этому вопросу, ища объектный метод, чтобы я мог использовать 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)

Как отмечается в других ответах , это будет неэффективно, если вы тестируете логическое значение.

0 голосов
/ 06 июня 2019

Могу ли я предложить метод Ruby-esque ! для результата метода nil?.

def logged_in?
  user.nil?.!
end

Настолько эзотерично, что RubyMine IDE помечает это как ошибку. ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...