Я не маю досвіду роботи в 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 нам не потрібно повертати true або false, оскільки ми маємо значення "неправдиве" та "хибне", як у 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?
повертає true, але"".present?
повертає false.