Ruby Programlama Temelleri
Ruby programlama dilinim temel yapısını öğrenmek ve dilin yapısını anlayabilmek için özet niteliğinde bir yazı hazırladım. Dile üstten bir bakış atacağız. Hazır mıyız?
Her programlama dilinde olduğu gibi Ruby içnde öncelikle “hello world yazarak başlayalım 😊
Puts "Hello World!"
Eevt bu kadar. Hemen araya sıkıştıralım kullanıcısdan input almak içinde gets metodu kullanılır.
VARAIBLES
Hocam tıpkı python’da da olduğu gibi değişken tanımlanırken tipini belirmene gerek yok.
Ruby için varaible types dersek dört çeşit tipten bahsedebiliriz.
global varaible $name
instance varaible @instance
class name @@name
constan varaible NAME
Bunlar şimdi dursun yazının devamınd abunlara değinicez.
COLLECTIONS
Collections dan kastım array, hash vb yapılar. Array tanımlama çok kolay
Arr = [1,2,3,4,5]
Arr2 = ["hasan", "enis", "feride"]
# hatta hem string hem int'de bulundurabilir
Arr3 = ["hakan", 13, 35, 56, "elif"]
.class diyerek değişkenşn tipini öğrenebilirisn yukarıdaki örneklerde arr3 de dahil olmak üzere tüm arkadaşların tipi Array’dir.
Arraya yeni elemen eklemek istesekte
Arr1 << 12
Şeklind e kolayca atama yapabiliriz.
Birde hash dediğimiz yapı var python daki sözlük yapısına benziyor
h1 = Hash.new
h1["key"] = "value"
#bu yukarıdaki sınıftan türetme
#istersen direkt bir değişken gibi de tanımlayabilirsin
ip_to_domain["hashas.com"]="123.23.235.123"
H2={"hasan"=>"sabbah",
"nizam"=>"el-mül"}
#dikkat etmemiz gereken nokta ilk değer key ikinci değer value olur
#direkt key ile value'a ulaşmak istersek
Puts H2["hasan"]
CONDITION
Hadi şart ifadeleri ile devam edelim
Karar ifadesi < > <= > = == != && || ifadeleri tamamen C ile aynı
Yine if else elsif aynı (elsif bitişik yazlıyor e yok :)) )
sadece parantez falan yok zaten dilin yapısı bu. Parantez komut sonuna ; vb gerekli değil.
sadece ufak bir fark var end koyuyorsun sonuna.
Örneklere bakalım daha anlaşılır olur.
a=10
if a<10
puts "a 10 dan küçük"
elsif a>10
puts "a 10 dan büyük"
else
puts "a 10 a eşit"
end
hm birde != demek yerine direk if keyword yerine unless kullanabilirsin.
Hemen bir örnekle açıklıyorum
if a==20 || a==10 && a==26
puts "a=20 + a=10 . a=26 is true"
end
unless a==20 || a==10 && a==26
puts "a=20 + a=10 . a=26 is not true"
end
# output : a=20 + a=10 . a=26 is not true
If keyword’de eğer saştımız doğruysa yani true dönerse çalılırsa unles’de ise false dönerse çalışır. Çünkü unless ifadesei != anlamına gelir
Yukarıdaki örnekte verilen condisition fals eolduğu için if’den geçemez ancak unless den geçer ve kodu çalıştırır. Bu yüzden çıktı “a=20 + a=10 . a=26 is not true” olur
Tüm dillerde bulunan bir ifademiz daha var şartı tek satırda yazmak
if 2.even?
puts "2 is even"
end
# code if condition
puts "2 is even" if 2.even?
Itiraf etmeliyim buna bende şaşırdım if’i tek satırda yazacağımız zaman önce kod partı sonra kontrol ifadesini yazıyoruz.
Birde if kullanmadan şart yazabiliriz.
Ternary oparator
hocam bu arkadaşda c dekine benziyor
#Yazım : şart ? turue:false
10<1 ? ( puts "nizamül mülk") : (puts "hasan sabbah")
Tenory operatorden başlamışken diğer operatorlerle devam edelim.
OPERATORS
Ruby de tuhaf tuhat operatorler var hepsini burada toplayıp anlatıcam özellikle ilginç olanları
<=>
greater equal or less
Arkadaşın adı spaceship operator. iki değeri kıyaslar
a<=> b
a<b ise -1
a=b ise 0
a>b ise 1 döndürür
a=10
b=11
puts a<=>b
puts (a+1)<=>b
puts (a+2)<=>b
#Output: -1 0 1
==
bizzat aynı olunca çalışır
obj1 = Obje.new("obje")
obj2 = Obje.new("obje")
obj1==obj2 #False
Bunlar aynı sınıftan da olsa farklı nesnelerdir id’leri farklı olur yani.
** <<
bu iki arkadaşta üst alma işlemi için kullanılabilir.
puts 10**2 #100
Puts 10<<1 #100
#işin ilginç kısmı bu << operatorunde bir tane fazlası olarka üst alır
= += %=
Bu arkadaşlar hem işlem yapıp hem atama yapar
a=10
a*=10
#a=100
a+=2
#a=102
a%=3 #bu mod atama operatorune ilk kez rastladım :)
#a=0
||= &&=
Öncelikle false hariç herşey true kabul edilir. 0 da true kabul edilir çünkü bir value.
||= false ise ata.
&&= true ise ata demektir
a = FALSE
a ||= "yada operatör"
puts a
a &&= "and operator"
puts a
#output :
# yada operatör
# and operatör
Yukarıda a=false olduğu için ||= atama yaptı. daha sonra string true olduğu için &&= da atama yaptı :))
! !!
tek ünlem değil demektir. !! buda değilin değili 360 derece yani
===
Bu üç eşittir sınıf kontrolu sağlıyor is_a? Metoduyla aynı görevi görür
puts String === "hasan"
puts "sa".is_a?(String)
Yani ruby’de === iki değişkeni kıyaslamak için kullanılmaz bir değişkenşin bir sınıfa ait olup olmadığını nöğrenmek için kullanılır. Ez cümle sınıf sorgusu yapar.
STRINGS
Değişten tiplerinden stringği ayrıca incelemiz gerekitr ki zaten bu bir değişken değil aslında bir sınıf. Kendisine özel metdoları olduğu için bu metodlardan sık kullanlına bir kaç tanesinği inceleyelim.
str1= String.new("hsan")
str2= "sabbah"
str3=str1+str2
puts str2
#output: hasan sabbah
#buradaki toplama işlemi string concatenation işlemidir.
string input işlemi
Input almak için gets metodu kullanılır. Ancak gets ile aldığımız zaman gets default olarak alınan stringe \n (alt satıra geçme) ekler. bu durumdam kurtulmak istersekte .chomp metodunu kullanırız.
str = gets
str2= gets.chomp
#p metodu ile stringin içerisindeki tüm karaketerleri görebiliriz.
#input olarak hasan yazdığımızı kabul ediyorum
p str
p str2
#output:
# "hasan\n"
# "hasan"
Upcase : stringdeki tüm karakterleri büyük harfe çevirir
Size : stringin uzunluğunu döndürür
Chars: stringdeki tüm elemnları bir cahr dizisi haliğne getiri. Aşşagğıda örnek verdim
+ : zaten yukarıda bahsettim iki stringi birleştirir
To_s : bir integarı stringe çevirir
To_i : bir stringi intagera çevirir
s = "hasan"
s.upcaase
c = s.chars
puts c
#output : ["H", "A", "S", "A", "N"]
Hocam kısaca bir yazdırma detaylarından da bahsedelim.
puts x
şeklinde direkt bir varaible’ı yazdırabilirsin. Atanmamış bir string yazdırmak için ise “ ” kullanılır
puts "elalem ne der?"
Ancak hem varaible hem string kullanacağın zaman #{} yapısını kullanmalısın.
x = 52
puts "hasan sabbah #{x} years old"
LOOPS
Gelelim döngülere. Hakikaten ruby’de döngüler dediğimiz zaman işleri kolaylaştıran ilginç döngü yöntemleri var. Örneklerini vererek her biri nden bahsedelim.
Dört farklı yöntemden ve bunlara biraz daha özellik katan birkaç keyword’den bahsedicez
Each, times, While, until dögü yapıları next unless, break ve select keyword’leri
Each
#bunlar kalsın aşşaıda loops için vereceğim tüm örneklerde bu array ve hashs kullanıcam
numbers =[1,2,3,4,5,6]
hash1 = {"hasan"=>1, "sabbah"=>2, "kemal"=>3, "kadri"=>4}
hash2 = {"elsa" =>"frozen_queen", "anna" => "fozen_prenses" , "olaf" =>"frozen_joker"}
Tek satırda each kullanarak bir döngü oluşturacaksan
syntax’ı array_name.each{ |itr | code } şeklinde olur
#EACH
numbers.each {|n| puts n}
#output : 1 2 3 4 5 6
Yukarıda sadece arrayaki values ulaştık eğer index ile birlikte ulaşmak istersek each’in farklı bir metodunu kullanmamız gerekir. Kullanacağımız metod each_with_index
numbers.each_with_index {|itr,index| puts"value : #{itr} index : #{index}"}
ancaak eğer iki değer alcaksak mesela hash için hem key hem value’u almak istersek direk ikim değer ile birden each loopunu kullanabiliriz. index almak ayrı bir işlem olduğu farklı metod gerekiyor.
hash1.each{|key,value| puts "#{key}'s number is #{value}"}
Puts "\n"
hash2.each{|key,value| puts "#{key} is #{value}"}
#output:
# hasan's number is 1
# sabbah's number is 2
# kemal's number is 3
# kadri's number is 4
#
# elsa is frozen_queen
# anna is fozen_prenses
# olaf is frozen_joker
RANGE
yeni bir arkadaş değil bir çeşit each. Yani normalde dögüde üzerinde ilerleyeceğimiz bir collection gerekir ya burada bir collection olmaksızın hemen tanımlayıp kullanbiliriz. Bu yapıyada range denilir. (start .. end)
(1..5).each{|i| puts i}
TIMES
En kolay loop şekli bu. Bu kadar kere şunu yap diyosun :)
3.times{|i|puts i}
Yani dostum bu array vb üzerine hareket etmek için değil 0 dan arırarak hareket etmek için adı üzerinde times. x times bir şeyler yapmak için 😊
WHILE
Eski dostum hoş geldin 😊
n=0
while n<5
puts n
n+=1
end
puts "the current value is #{n}"
#hocam bu kısma dikkat içerisindekş değişiklik kalıcı oluyor. bu durum C'de de
#aynı
Array ile kullanımı için aşşağıda bir örnek var.
i=0
while i<6
puts numbers[i]
i+=1
end
UNTIL
Gelelim Until’e while ile aynı sadece false olduğu sürece devam eder true olduğunda durur
x=0
while x!=3
puts x**2
x+=1
end
x=0
until x==3
puts x**2
x+=1
end
Gelelim keyword’lere
NEXT
Dostum diğer dillerdeki continue keyword’une tekabul eder. Next bu adımı turu geç, kodun devamını okumadan döngünün başlangıç noktasına dön demektir bir adımı next’ler yani.
10.times do |i|
next unless i.even?
puts i*10
end
puts "\n"
numbers.each do |n|
next unless n.odd?
puts n*100
end
#output :
# 0 20 40 60 80
# 100 300 500
Mevzuyu anladık herhalde . Tek satır olduğunda each’te {} times’da () kullanmak yeterli olur. Ancak birden fazla satırsa do ve sonunda da end gerekir.
BREAK
Bildiğin break işte döngüyü kırar. Next gibi değildir sadece bir adım ile bir tur ile ilgilenmez çalıştığı zaman devamındaki koda da bakmaksızın işlemi bitirir ve döngüden çıkar.
k=0
while k<100
puts "#{k}.şirin"
k+=1
break if k==3
end
#output :
# 0.şirin
# 1.şirin
SELECT
Bak bak neler var.
Yeni bir keyword c java gibi dillerde yok. Hem döngü hem condition birlikte bulundurur.
arr_try = numbers.select(&:even?)
puts arr_try
#output
# 2 4 6
UPTO
İşte dostum bu ruby dilinin ne kadar flexible bir dil olduğunun kanıtıdır. başlangıç_değeri.upto(bitiş_değeri){ code } şekllindedir syntax’ı. Bu değerden bu değere kadan verdiğim kodu tekrar takrar çalıştır der. Pekii bunu normal integer ile yapabiliyoruzda bir array ile yapamaz mıyız? Tabiki yaparız. Hatta char dizisinde dahi yapabilriz. Aşşağıdaki örneklerde görebilriz.
str=["a", "b", "c", "d", "e"]
1.upto(7) {|i| puts i}
numbers[0].upto(numbers[4]){|x| puts x}
str[0].upto(str[4]{|itr| puts itr}
#output :
# 1 2 3 4 5 6 7
# 1 2 3 4 5
# a b c d e