Kodumda şu mantık var:
if !@players.include?(p.name)
...
end
@players
bir dizidir. Önlemek için bir yöntem var mı !
?
İdeal olarak, bu pasaj şöyle olacaktır:
if @players.does_not_include?(p.name)
...
end
Kodumda şu mantık var:
if !@players.include?(p.name)
...
end
@players
bir dizidir. Önlemek için bir yöntem var mı !
?
İdeal olarak, bu pasaj şöyle olacaktır:
if @players.does_not_include?(p.name)
...
end
Yanıtlar:
if @players.exclude?(p.name)
...
end
ActiveSupport ekler exclude?
yöntemi için Array
, Hash
ve String
. Bu saf Ruby değil, bir sürü rubyist tarafından kullanılıyor.
require 'active_support/core_ext/enumerable'
Hadi bakalım:
unless @players.include?(p.name)
...
end
Benzer teknikler hakkında daha fazla bilgi için Ruby Stil Kılavuzuna bakabilirsiniz .
if flag unless @players.include?(p.name)
gariptir ve if flag && !@players.include?(p.name)
olumsuzlama kullanır.
if
let sadece true
koşulunu geçmek unless
geçmesine izin verir false
ve nil
. Bu bazen hataları bulmakta zorlanır. Bu yüzden tercih ediyorumexclude?
Aşağıdakiler nasıl olur:
unless @players.include?(p.name)
....
end
Sadece Ruby'ye bakarken:
TL; DR
Karşılaştırma için none?
bir blok geçirerek kullanın ==
:
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?
bir bağımsız değişkeni kabul eder ==
ve dizideki her bir öğeyi denetlemek için kullanır :
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?
bir argümanı da kabul edebilir, bu durumda ===
karşılaştırma için kullanır . Karşıt davranışı elde etmek include?
için parametreyi atlıyoruz ==
ve karşılaştırma için kullanarak bir blok geçiriyoruz.
player.none? { |n| 7 == n }
#=> true
!player.include?(7) #notice the '!'
#=> true
Yukarıdaki örnekte aslında şunları kullanabiliriz:
player.none?(7)
#=> true
Çünkü Integer#==
ve Integer#===
eşdeğerdir. Ancak şunu düşünün:
player.include?(Integer)
#=> false
player.none?(Integer)
#=> false
none?
false
çünkü döner Integer === 1 #=> true
. Ama gerçekten yasal bir notinclude?
yöntem geri dönmeli true
. Daha önce yaptığımız gibi:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
Tamam, ama cidden, sürece işe yaramaz.
unless
snippet'la 's ok gösterdi ama durum daha karmaşık olabilir. Bu olumsuzlanmış yöntemlere sahip olmanın kullanışlı olduğunu düşünüyorum, daha açıklayıcı kodlara izin veriyorlar.
Kullanım unless
:
unless @players.include?(p.name) do
...
end
Kullanılması unless
tek olan tablolar için gayet include?
Eğer birinde şeyin dahil kontrol gerektiğinde, örneğin, maddeleri fakat Array
ancak bir başkasında, kullanımı include?
ile exclude?
çok dostça.
if @players.include? && @spectators.exclude? do
....
end
Ancak dizzy42'nin yukarıda söylediği gibi, exclude?
ActiveSupport kullanımı
Bunu deneyin, saf Ruby, bu yüzden herhangi bir çevre çerçevesi eklemenize gerek yok
if @players.include?(p.name) == false do
...
end
Birkaç gün boyunca benzer bir mantıkla mücadele ediyordum ve birkaç forum ve soru-cevap panosunu az boşuna kontrol ettikten sonra, çözüm aslında oldukça basitti.
Bunu kendim için aradım, buldum ve sonra bir çözüm buldum. İnsanlar kafa karıştırıcı yöntemler ve belirli durumlarda çalışmayan ya da hiç çalışmayan bazı yöntemler kullanıyorlar.
Bunun 6 yıl önce yayınlandığını düşünerek artık çok geç olduğunu biliyorum, ancak umarım gelecekteki ziyaretçiler bunu bulur (ve umarım kodlarını temizleyebilirler.)
Basit çözüm:
if not @players.include?(p.name) do
....
end
do
geçerli yakut? bir hata alıyorumsyntax error, unexpected end-of-input
(kaldırırsam çalışırdo
)