Saya punya logika berikut dalam kode saya:
if !@players.include?(p.name)
...
end
@players
adalah sebuah array. Apakah ada metode sehingga saya bisa menghindari itu !
?
Idealnya, cuplikan ini adalah:
if @players.does_not_include?(p.name)
...
end
ruby-on-rails
ruby
Tyler DeWitt
sumber
sumber
do
ruby yang valid? saya mendapatkan kesalahansyntax error, unexpected end-of-input
(berfungsi jika saya menghapusdo
)Jawaban:
ActiveSupport menambahkan
exclude?
metode untukArray
,Hash
, danString
. Ini bukan Ruby murni, tetapi digunakan oleh BANYAK pembuat ruby.Sumber: Ekstensi Inti Dukungan Aktif (Panduan Rails)
sumber
require 'active_support/core_ext/enumerable'
Ini dia:
Anda mungkin melihat Panduan Gaya Ruby untuk info lebih lanjut tentang teknik serupa.
sumber
if flag unless @players.include?(p.name)
canggung danif flag && [email protected]?(p.name)
menggunakan negasi.if
biarkan hanyatrue
melewati kondisi,unless
mari lewatfalse
dannil
. Ini kadang-kadang menyebabkan sulit untuk menemukan bug. Karena itu saya lebih sukaexclude?
Bagaimana dengan yang berikut:
sumber
Hanya melihat Ruby:
TL; DR
Gunakan
none?
melewatinya satu blok dengan==
untuk perbandingan:Array#include?
menerima satu argumen dan digunakan==
untuk memeriksa setiap elemen dalam array:Enumerable#none?
juga dapat menerima satu argumen yang digunakan===
untuk perbandingan. Untuk mendapatkan perilaku yang berlawanan,include?
kami menghilangkan parameter dan memberikannya blok==
untuk perbandingan.Dalam contoh di atas kita dapat menggunakan:
Itu karena
Integer#==
danInteger#===
setara. Tapi pertimbangkan:none?
kembalifalse
karenaInteger === 1 #=> true
. Tetapinotinclude?
metode yang benar-benar harus dikembalikantrue
. Seperti yang kami lakukan sebelumnya:sumber
Ok, tapi serius, kecuali berfungsi dengan baik.
sumber
unless
tidak apa-apa untuk cuplikan cuplikan, tetapi kondisinya mungkin lebih rumit. Saya pikir ini berguna untuk memiliki metode yang dinegasikan ini, mereka memungkinkan lebih banyak kode deklaratif.Gunakan
unless
:sumber
Bisakah Anda menggunakan:
unless
kebalikan dariif
, atau Anda dapat menggunakanreject
.Anda dapat
reject
elemen yang tidak diperlukan:setelah mendapatkan hasil Anda dapat melakukan implementasi Anda.
sumber
Menggunakan
unless
baik-baik saja untuk pernyataan dengan satuinclude?
klausa tetapi, misalnya, ketika Anda perlu memeriksa dimasukkannya sesuatu dalam satuArray
tetapi tidak dalam yang lain, penggunaaninclude?
denganexclude?
jauh lebih ramah.Tetapi seperti yang dikatakan dizzy42 di atas, penggunaan
exclude?
membutuhkan ActiveSupportsumber
Coba sesuatu seperti ini:
sumber
Coba ini, ini murni Ruby sehingga tidak perlu menambahkan kerangka periferal
Saya berjuang dengan logika yang sama selama beberapa hari, dan setelah memeriksa beberapa forum dan papan Q&A sedikit berhasil ternyata solusinya sebenarnya cukup sederhana.
sumber
Saya mencari ini untuk diri saya sendiri, menemukan ini, dan kemudian solusi. Orang menggunakan metode yang membingungkan dan beberapa metode yang tidak berfungsi dalam situasi tertentu atau tidak sama sekali.
Saya tahu ini sudah terlambat sekarang, mengingat ini telah diposting 6 tahun yang lalu, tapi semoga pengunjung yang akan datang menemukan ini (dan mudah-mudahan, ini dapat membersihkan kode mereka, dan Anda.)
Solusi sederhana:
sumber