Есть ли Ruby, или Ruby-ism для not_nil? напротив nil? метод?

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

def logged_in?
  !user.nil?
end

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

def logged_in?
  user.not_nil?
end

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

Ответ 2

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

def logged_in?
  user
end

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

Обновление

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

def logged_in?
  user.present?
end

Ответ 3

Возможно, это может быть подход:

class Object
  def not_nil?
    !nil?
  end
end

Ответ 4

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

Ответ 5

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

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

Это работает не только для nil, но и для флагов и т.д., поэтому вы должны проверить, не работает ли это в вашей usecase.

Ответ 6

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

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

Ответ 7

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

def logged_in?
  user.nil?.!
end

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