Saya tidak berpengalaman dalam Ruby, jadi kode saya terasa "jelek" dan tidak idiomatis:
def logged_in?
!user.nil?
end
Saya lebih memilih sesuatu seperti
def logged_in?
user.not_nil?
end
Tetapi tidak dapat menemukan metode yang berlawanan nil?
ruby-on-rails
ruby
null
berkes
sumber
sumber
present?
membutuhkan string yang tidak kosong.! "".nil?
mengembalikan nilai benar, tetapi"".present?
mengembalikan salah.false.present? == false
!false.nil? == true
Anda tampaknya terlalu khawatir dengan boolean.
def logged_in? user end
Jika pengguna nihil, lalu login_in? akan mengembalikan nilai "falsey". Jika tidak, itu akan mengembalikan objek. Di Ruby kita tidak perlu mengembalikan true atau false, karena kita memiliki nilai "truthy" dan "falsey" seperti di JavaScript.
Memperbarui
Jika Anda menggunakan Rails, Anda dapat membuat pembacaan ini lebih baik dengan menggunakan
present?
metode:def logged_in? user.present? end
sumber
?
adalah mengembalikan boolean.!!value
adalah cara klasik untuk mengonversi apa pun menjadi boolean. Tidak persis sama, tapi dalam hal iniObject#present?
RoR juga bagus.Waspadai jawaban lain yang muncul
present?
sebagai jawaban atas pertanyaan Anda.present?
adalah kebalikan dariblank?
in rails.present?
memeriksa apakah ada nilai yang berarti. Hal-hal ini dapat gagal dalampresent?
pemeriksaan:"".present? # false " ".present? # false [].present? # false false.present? # false YourActiveRecordModel.where("false = true").present? # false
Sedangkan
!nil?
cek memberikan:!"".nil? # true !" ".nil? # true ![].nil? # true !false.nil? # true !YourActiveRecordModel.where("false = true").nil? # true
nil?
memeriksa apakah suatu objek sebenarnyanil
. Ada lagi: string kosong,0
,false
, apa pun, tidaknil
.present?
sangat berguna, tapi jelas bukan kebalikan darinil?
. Membingungkan keduanya dapat menyebabkan kesalahan yang tidak terduga.Untuk kasus penggunaan Anda
present?
akan berfungsi, tetapi selalu bijaksana untuk menyadari perbedaannya.sumber
false.blank?
tidak sama denganfalse.nil?
present?
akan menanyakan database Anda,nil?
tidak akan, berhati-hatilah dengan ituMungkin ini bisa menjadi pendekatan:
class Object def not_nil? !nil? end end
sumber
!self.nil?
lebih dari itu!nil?
, atauself
implisit?Izinkan saya menawarkan metode Ruby-esque
!
pada hasil darinil?
metode tersebut.def logged_in? user.nil?.! end
Sangat esoteris sehingga RubyMine IDE akan menandainya sebagai kesalahan. ;-)
sumber
Anda bisa menggunakan yang berikut ini:
if object p "object exists" else p "object does not exist" end
Ini tidak hanya bekerja untuk nil tetapi juga false dll, jadi Anda harus menguji untuk melihat apakah itu berhasil dalam usecase Anda.
sumber
Saya sampai pada pertanyaan ini mencari metode objek, sehingga saya bisa menggunakan
Symbol#to_proc
singkatan alih-alih blok; Saya merasaarr.find(&:not_nil?)
agak lebih mudah dibaca daripadaarr.find { |e| !e.nil? }
.Metode yang saya temukan adalah
Object#itself
. Dalam penggunaan saya, saya ingin menemukan nilai dalam hash untuk kunci tersebutname
, di mana dalam beberapa kasus kunci tersebut secara tidak sengaja dikapitalisasi sebagaiName
. Satu baris itu adalah sebagai berikut:# Extract values for several possible keys # and find the first non-nil one ["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Seperti disebutkan dalam jawaban lain , ini akan gagal secara spektakuler jika Anda menguji boolean.
sumber
my_hash.values_at("Name", "name").find
?map
yang saya hapus untuk kesederhanaan dalam contoh ini, jadi seperti yang tertulis di sini itu dapat dipertukarkan denganvalues_at
. Bagian terpenting adalah apa yang diteruskanfind
.