Ruby'de "not" ve "!" Arasındaki fark


Yanıtlar:


145

Neredeyse eşanlamlıdırlar, ancak tam olarak değiller. Fark olmasıdır !daha yüksek önceliğe sahiptir notçok gibi, &&ve ||daha yüksek önceliğe sahiptir andve or.

!tüm işleçler arasında en yüksek önceliğe sahiptir ve en notdüşük olanlardan biridir , tam tabloyu Ruby belgelerinde bulabilirsiniz .

Örnek olarak şunları düşünün:

!true && false
=> false

not true && false
=> true

İlk örnekte, !en yüksek önceliğe sahiptir, yani etkili bir şekilde söylüyorsunuz false && false.
İkinci örnekte, notdaha düşük bir önceliğe sahiptir true && false, bu nedenle bu, ' falsedan' true && falseye "değiştirildi" true.

Genel kural !, kullanmak için belirli bir nedeniniz olmadıkça, bağlı kalmanız gerektiği gibi görünüyor not. !Ruby'de diğer birçok dilde aynı şekilde davranır ve bundan "daha az şaşırtıcı" dır not.


6
Geçmişte, olumsuzlanmış koşulların okunmasını kolaylaştırmak için 'not'u kullandım. Yani, koşulun tamamı reddedilirse, '!' Yerine 'değil' kullanmakta rahat hissettim. Kodumun
inglush

@jaydel unlessBu durumda kullanabilir misiniz ?
Jacob

1
@Jacob, evet, kesinlikle. unlessRuby dünyasında pek tercih edilmiyor. Genel fikir birliği, !çoğu durumda olduğu gibi işe yaradığında sadece yoluna girmesidir. Eminim daha anlamlı olmayacak durumlar vardır, ama ben net konuşuyorum.
Brennan

4
Bunun unlessbeğenilmediğine katılmıyorum . Fikir birliğine en yakın olan şey aksini söylüyor.
Adam Lassek

1
Sadece ne kadar şaşırtıcı notolabileceğine dair bir örnek paylaşmak istedim . Python'da, if ifadelerinin okunmasını kolaylaştırmak için bazen değişkenlere boole atarım. Bu x = not y, y'nin karmaşık bir şey olduğu kalıbı kullanmak anlamına gelebilir . Ruby'de x = !yçalışır, ancak x = not yalır syntax error, unexpected tIDENTIFIER, expecting '('. Öncelik sırası bu işe atama op sağında parantez ihtiyacı anlamına gelir: x = (not y).
S. Kirby

13

notOperatörü anlamanın kolay bir yolu not true && falseşuna eşdeğer olarak bakmaktır.!(true && false)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.