Ruby Programlama Temelleri

Gökçe Soylu
7 min readJun 16, 2024

--

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
🙌🏾

--

--

Gökçe Soylu

Computer engineer student at Aydın Adnan Menderes Universty