Mantıksal İşlemler 7.1 true, false, nil

7
Mantıksal İşlemler
7.1
true, false, nil
Doğru ya da Yanlış değer alan önermelere (ifadelere) mantıksal (logic) deyimler ya da boolean deyimler denilir ([5]).
Bir çok dilde mantıksal işlemler true ve false değerlerinden oluşan
bir sınıfa ait metotlarla yapılır. Bunlara mantıksal ya da boolean değerler
denilir. Bu değerleri içeren sınıfa, çoğu dilde Bool sınıfı adı verilir. and, or,
not temel mantıksal bağlaçlardır.
Ruby’deki durum oldukça farklıdır. Ruby’de Bool ya da Boolean
adında bir veri tipi (sınıf) yoktur. true ve false nesnelerine ek olarak nil
nesnesi de mantıksal değer olarak kullanılır. Daha doğrusu mantıksal deyimin değeri yok anlamına gelir.
Ruby’nin true, false, nil anahtar sözcükleri bir tek sınıftan üretilmez.
Her birisinin kendi sınıfı vardır. Her birisi kendi sınıfının biricik (singleton)
nesnesidir. Onların hangi sınıftan türetildiğini görmek için class metodunu
kullanabiliriz.
Liste 7.1.
true . class
false . class
nilclass
# => T r u e C l a s s
# => F a l s e C l a s s
# => N i l C l a s s
false ve nil olmayan mantıksal ifadeler true (doğru) sayılır.
nil terimi boş, yani değer yok anlamındadır. Bazı dillerdeki null teriminin oynadığı rolü oynar; atanmış bir değer olmadığı anlamına gelir.
BÖLÜM 7. MANTIKSAL İŞLEMLER
88
Gerçekte, Ruby’nin true, false, nil anahtar sözcükleri birer nesneyi
işaret eden pointerlerdir. Birer sayı işaret etmezler. Başka bir deyişle, bazı
dillerde olduğu gibi, yanlış anlamına gelen false ve nil nesneleri 0 değildir,
doğru anlamına gelen true 1 değildir.
Ruby’de her şey nesne olduğuna göre, mantıksal ifadeler de birer nesnedir. Bir obj nesnesinin nil olup olmadığını anlamak için
2
o b j == n i l
obj . n i l l ?
deyimleri kullanılabilir. Örneğin, 3 == nil ya da 3.nil? deyimleri aynı işlevi
görür; her ikisinin karşılığı false olur.
Liste 7.2.
3
0. class
1. class
0 == f a l s e
0. n i l ?
0 == n i l
n i l == f a l s e
1 == t r u e
#
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
=>
Fixnum
Fixnum
false
false
false
false
false
#=> simgesinin sağındaki çıktı ifadesi false ise, solundaki mantıksal ifadenin yanlış olduğu anlamı çıkar. 6.satırdan görüldüğü gibi, mantıksal işlemlerde yanlış rolünü oynayan nil nesnesi false nesnesinden farklıdır.
Ruby’nin true, false, nil anahtar sözcüklerinin işaret ettikleri nesneler
biriciktirler (singleton). Bu demektir ki, true, false ve nil birer tanedir. Birer
taneden çok true, false ve nil değerleri olamaz.
Her ad bir nesneyi işaret bir pointerdir. Ancak, sözel ifadeyi kısaltmak için pointer ile işaret ettiği nesneyi çoğunlukla aynı sayacak ve "x
pointerinin işaret ettiği nesne" demek yerine, kısaca "x nesnesi" diyeceğiz.
Ruby’de bir değeri olmayan her nesne nil’dir. Örneğin çok kullandığımız puts, print, inspect gibi metotlar nil’dir. String nesneleri nil’dir, sayılar
nil’dir. Bunu görmek için
3
puts
puts
puts
puts
puts
put
print
inspect
12
" abc "
#
#
#
#
#
=>
=>
=>
=>
=>
nil
nil
nil
12
abc
=> n i l
=> n i l
olduğunu görmek yetecektir. 4.satırda puts metodu 12 sayısını yazıyor,
sonra onun nil olduğunu belirtiyor. 5.satırda puts metodu "abc" stringini
yazıyor, sonra o stringin nil olduğunu belirtiyor.
Ruby’de nil olmayan nesneler de vardır. Sınıflar ve modüller nil değildir. Örneğin,
7.1. TRUE, FALSE, NIL
89
Liste 7.3.
5
10
String . n i l ?
S t r i n g == n i l
Numeric . n i l ?
Numeric == n i l
Float . n i l ?
F l o a t == n i l
TrueClass . n i l ?
T r u e C l a s s == n i l
NilClass . n i l ?
nil . nil ?
#
#
#
#
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
false
false
false
false
false
false
false
false
false
true
Buradan anlaşıldığı üzere, ilk 9 satırdaki sınıflar nil değildir, ama nil’in
kendisi de nil’dir.
Örnekler:
nil? metodu, öntakısının nil olup olmadığını soruyor. Örneğin, x nesnesi için, x.nil? true ise x nesnesi nil’dir.
5
p u t s ( " Merhaba Ruby " ) . n i l ?
42. n i l ?
#
false
0. n i l ?
#
false
"" . nil ?
#
false
nil . nil ?
#
true
#
true
Liste 7.4.
5
10
BasicOject . n i l ?
B a s i c O b j e c t == n i l
Object . n i l ?
O b j e c t == n i l
Module . n i l ?
Module == n i l
Math . n i l ?
Math == n i l
IO . n i l ?
IO == n i l ?
#
#
#
#
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
false
false
false
false
false
false
false
false
false
false
Ruby’de true, false ve nil nesnelerinin sayı olmadıklarını anlamak için
onlarla aritmetik işlemler yapmayı deneyebiliriz:
Liste 7.5.
true + 1
false + 0
nil + 1
# => u n d e f i n e d method
# => u n d e f i n e d method
# => u n d e f i n e d method
Benzer eylemi String için de yapabiliriz. Liste 7.6 nil’in String nesnesi olmadığını gösterir.
Liste 7.6.
BÖLÜM 7. MANTIKSAL İŞLEMLER
90
2
" abc " + n i l
# => TypeError : no i m p l i c i t c o n v e r s i o n o f n i l i n t o S t r i n g
n i l + " abc "
# => NoMethodError : u n d e f i n e d method ‘+ ’ f o r n i l : N i l C l a s s
Ruby’de mantıksal bir ifade içindeki nil değeri false gibi davranır.
Liste 7.7.
1
true & n i l
true | n i l
false & nil
false | nil
6
t r u e and n i l
true or n i l
f a l s e and n i l
f a l s e or n i l
7.1.1
#
#
#
#
=>
=>
=>
=>
#
#
#
#
false
false
false
false
=>
=>
=>
=>
false
false
false
false
Mantıksal İşlemler (boolean operations)
VEYA (OR) İşlemi
p ile q iki mantıksal deyim ise p VEYA q (p||q) işlemi iki mantıksal deyimi
birleştirir, birleşik bir deyim yapar.
true yerine T , false yerine F koyarsak p ile q ’nun değerlerine göre
(p||q) birleşik deyiminin doğruluk değerlerini bir tablo biçiminde daha kolay
görebiliriz (bkz. Tablo 7.1). Buna kısa devre V EY A denilir. Gerçekten, p
p
T
T
F
F
q
T
F
T
F
p || q
T
T
T
F
Tablo 7.1: [|| işlemi]
doğru ise q’yu denetlemeye gerek kalmaz.
VE (AND) İşlemi
p ile q iki mantıksal deyim ise p ve q (p&q) işlemi iki mantıksal deyimi
birleştirir, birleşik bir deyim yapar.
7.1. TRUE, FALSE, NIL
91
p
T
T
F
F
q
T
F
T
F
p&q
T
F
F
F
Tablo 7.2: [& işlemi]
p ile q ’nun değerlerini bir tablo biçiminde yazarsak, (p&q) birleşik deyiminin doğruluk değerlerini daha kolay görebiliriz (bkz. Tablo 7.2).
Buna kısa devre V E denilir. Gerçekten, p yanlış ise q’yu denetlemeye gerek
kalmaz.
değil (not) İşlemi
p bir mantıksal deyim ise (!p) işlemi p nin değerini true ise false, false ise
true yapar.
(!) operatörünün öncelik sırası, boolean olmayan operatörlerden sonradır.
p ’nin değerlerini bir tablo biçiminde yazarsak, (!p) deyiminin doğruluk
değerlerini daha kolay görebiliriz (bkz. Tablo 7.3).
p
T
F
!p
F
T
Tablo 7.3: değil işlemi
true değerini T , false değerini F ve nil değerini N ile gösterirsek p, q ve
r = p & q ve r = p || q mantıksal ifadelerinin alacağı değerler aşağıdaki
tablolarda gösterilmiştir.
p
N
N
F
q
N
F
N
p&q
N
N
F
Tablo 7.4: [nil ile AND işlemleri]
BÖLÜM 7. MANTIKSAL İŞLEMLER
92
p
N
N
F
q
N
F
N
p || q
N
F
N
Tablo 7.5: [nil ile OR işlemleri]
7.2
Karşılaştırma Operatörleri
Karşılaştırma (mukayese) Operatörleri, hemen her programlama dilinde
olan ve Liste 7.8’de görülen operatörlerdir. Bazı kaynaklarda bunlara ilişkisel (relational) operatörler denilir. Karşılaştırma operatörlerini mantıksal
deyimler oluştururken kullanırız. Ruby’de bütün nesnelere mukayese operatörleri uygulanabilir. Hepsi için öncelik sırası aynıdır ve boolean operatörlerinden öncedirler ([1]).
Liste 7.8.
<, <=, >, >=, ==, !=, is, is not
Bu operatörler, soldaki nesneyi sağdaki ile karşılaştırır. Sözdizimleri ve açıklamaları Tablo 7.6’de görülmektedir.
Sözdizimi
x<y
x <= y
x>y
x >= y
x == y
x != y
x is y
x is not y
Açıklama
x nesnesi y
x nesnesi y
x nesnesi y
x nesnesi y
x nesnesi y
x nesnesi y
x nesnesi y
x nesnesi y
nesnesinden küçük mü?
nesnesinden küçük mü ya da ona eşit mi?
nesnesinden büyük mü?
nesnesinden büyük mü ya da ona eşit mi?
nesnesine eşit mi?
nesnesinden farklı mı?
nesnesi ile aynı mı?
nesnesinden farklı mı?
Tablo 7.6: Karşılaştırma Operatörlerinin Sözdizimi
Karşılaştırma İçin Genel Kurallar
• Karşılaştırılan nesneler birbirleriyle mukayese edilebilir olmalıdır. Çoğunlukla karşılaştırılan nesneler aynı tipten olur.
• < ,<=, >, >= operatörlerinin öncelik sıraları, karşılaştırılan nesnelere
bağlıdır.
7.3. ALIŞTIRMALAR
93
• Sayılar için standard sıralama kullanılır.
• Boolean değerler için false önce, true sonra gelir.
• String tipler için alfabetik sıra kullanılır. ascii stringleri için, karekterlerin ascii kodları sıralamayı belirler.
• Kümeler için altküme üstkümeden önce gelir.
• Değişemez (immutable) tiplerde is operatörü == operatörüne, is not
operatörü != operatörüne denk işleve sahip olur.
• Değişebilir (mutable) tiplerde x == y olmak üzere, x değişirse y de
değişir.
7.3
Alıştırmalar
Liste 7.9.
1
6
2 < 5
3 < 3
" abc " <= " ad "
3 <= 3
5 > 2
3 == 3
2 != 4
#
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
=>
true
false
true
true
true
true
true
&& ile and ve= operatörlerinin öncelik sıraları farklıdır. Önceden
sonraya doğru sıralama şöyledir:
3
1 . \&\&
2. =
3 . and
Aşağıdaki iki programı karşılaştırınz. Parantezlerle doğru önceliğin
nasıl belirlenebileceğini görünüz.
Liste 7.10.
2
>
>
>
>
t e s t = f a l s e and t r u e
test
# => f a l s e
t e s t = t r u e and f a l s e
test
# => t r u e
# => f a l s e
# => f a l s e
Açıklamalar:
Atama (=) operatörü ikisi arasındadır. O nedenle, 1. satırda öncelik
(=) operatörünündür Dolayısyla bütün ifade [(test = false) and true]
BÖLÜM 7. MANTIKSAL İŞLEMLER
94
olur. 1.satır (false and true) == false olur. 2.satır için test == false
değeri yazılıyor; false çıktısı gelir. 3.satır ise [(test = true) and false] ifadesine
eşittir. 3.satır true and false== false değerini veriyor. 4.satır ise test=true
değerini yazıyor.
Liste 7.11.
1
b = f a l s e && t r u e
b
# => f a l s e
b = t r u e && f a l s e
b
# => f a l s e
# => f a l s e
# => f a l s e
Açıklamalar:
Bu örnekte && operatörü atama operatörünün önüne geçtiği için,
daima eşitliğin sağındaki değerler yazılıyor.
Önceliği Belirlemek
&& ile and ve= operatörlerini içeren bir ifade yazarken, parantez kullanarak öncelikleri istediğimiz gibi yapabiliriz; çünkü () parantezi sözkonusu
operatörlerden önce gelir. Örneğin Liste 7.10 için önceliği eşitliğin sağındaki
ifadelere vermek için,
test = (true and false)
yazmak yetecektir.
Liste 7.12.
1
n i l . to_s
n i l . to_i
# => " "
# => 0
Liste 7.13.
3
4 && 5
n i l && t r u e
t r u e && n i l
true | | n i l
nil || ""
#
#
#
#
#
=>
=>
=>
=>
=>
5
nil
nil
true
""
Liste 7.14 içindekileri irb’de tek tek deneyiniz.
Liste 7.14.
7.3. ALIŞTIRMALAR
t r u e && t r u e
# =>
f a l s e && t r u e
# =>
1 == 1 && 2 == 1
# =>
" t e s t " == " t e s t "
# =>
1 == 1 | | 2 != 1
# =>
t r u e && 1 == 1
# =>
f a l s e && 0 != 0
# =>
t r u e | | 1 == 1
# =>
" Ankara " == " A n k a r a l ı " # =>
1 != 0 && 2 == 1
# =>
" Ankara " != " A n k a r a l ı " # =>
" t e s t " == 1
# =>
! ( t r u e && f a l s e )
# =>
! ( 1 == 1 && 0 != 1 )
# =>
! ( 1 0 == 1 | | 1000 == 1 0 0 0 )
! ( 1 != 10 | | 3 == 4 )
# =>
1 == 1 && ( ! ( " A n k a r a l ı " == 1
5
10
15
95
true
false
false
true
true
true
true
true
false
false
true
false
true
false
# => f a l s e
false
| | 1 == 0 ) )
# => t r u e
Ruby’de mantıksal değerlerin true, false ve nil değer aldığını biliyoruz.
Mantıksal ifade içinde yer alan nil, öteki mantıksal değerlerle and,
or, && ve || operatörleriyle etkileşebilir:
Liste 7.15.
t r u e and n i l
t r u e && n i l
# => n i l
# => n i l
true or n i l
true | | n i l
# => t r u e
# => t r u e
f a l s e and n i l
f a l s e && n i l
# => f a l s e
# => f a l s e
f a l s e or n i l
false || nil
# => n i l
# => n i l
! nil
not n i l
# => t r u e
# => t r u e
3
8
13
Değişkenler nil olabilir
Değerler nil olabilir
Değerler true ya da false değer alabilirler
nil bir nessnenin değerinin olmadığı anlamına gelir
Sayılar, string’ler, true, false ve nil’in kendisi nil’dir.
Sınıflar ve modüller nil değildir.
Liste 7.16.
96
1
6
BÖLÜM 7. MANTIKSAL İŞLEMLER
if
false
print "a"
e l s i f true
print "b"
else
print " c "
end
Liste 7.17.
if 0
3
print "a"
elsif 1
print "b"
else
print " c "
end
Aşağıdaki programı eğlence diye çalıştırınız. Sonra da hangi kodun
çalıştığını anlamaya çalışınız.
Liste 7.18.
if
3
true
p u t s " e v r e n s e l d o ğ r u l a r v a r d ı r , yok mu? "
else
puts " e v r e n s e l y a n l ı ş l a r var mıdır ? "
end
if
8
13
nil
p u t s " n i l : y o k l u k doğrudur ; "
else
puts " n i l :
yokluk y a n l ı ş t ı r "
end
if
false
puts " f a l s e mantıksal deyimdir "
else
p u t s " f a l s e m a n t ı k s a l deyim d e ğ i l d i r "
end