Skip to content

Instantly share code, notes, and snippets.

@cptangry
Last active June 22, 2019 12:45
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cptangry/7b4499bc0a2bdef361ca14389fccb8b7 to your computer and use it in GitHub Desktop.
Save cptangry/7b4499bc0a2bdef361ca14389fccb8b7 to your computer and use it in GitHub Desktop.
Tek dosyada Ruby Programlama Dilinin Temellerini Öğren ve Dene. Çalıştırılabilir Betik dosyası
# coding: utf-8
# Tek satırlık yorum yazmak için # kullandık
# Version: Ruby-2.4.1
=begin
Ruby Programlama Dili, 1995 itibariyle yayınlaşmış,
Matsumoto Yukihiro (Japoncada soyad önce söylenir)
tarafından geliştirilmeye başlanmış özgür bir projedir.
Bu da bir çok satırlı yorumdur.
=end
# Her şeyden önce: Her şey bir NESNEDİR!
p 3.class # => Integer # 2.4 öncesi Fixnum
p "3".class # => String
# Temel aritmetik işlemleri
toplama = 2 + 2
cikarma = 6 - 6
carpma = 2 * 4
bolme = 75 / 5
us_alma = 4 ** 2
modul_alma = 4 % 2
puts "ARİTMETİK İŞLEMLER"
puts "Toplama: 2 + 2 = ", toplama
puts "Çıkarma: 6 - 6 = ", cikarma
puts "Çarpma: 2 * 4 = ", carpma
puts "Bölme: 75 / 5 = ", bolme
puts "Üs Hesaplama: 4 ** 2 = ", us_alma
puts "Mödül: 4 % 2 = ", modul_alma
# Ekran çıktısında da göreceğiniz üzere puts aldığı her değerin sonuna
# bir \n karekteri yani yeni satır bildirimi ekliyor ve bunun sonucunda da
# puts "Toplama: 2 + 2 = ", toplama çıktısı
# Toplama: 2 + 2 =
# 4
# oluyor. Bu durumun oluşmaması için print kullanabiliriz.
print "Toplama: 2 + 2 = ", toplama, "\n"
print "Çıkarma: 6 - 6 = ", cikarma, "\n"
print "Çarpma: 2 * 4 = ", carpma, "\n"
print "Bölme: 75 / 5 = ", bolme, "\n"
print "Üs Hesaplama: 4 ** 2 = ", us_alma, "\n"
print "Mödül: 4 % 2 = ", modul_alma, "\n"
# Bit işlem operatörleri
bit_islem_ampersand = 3 & 5
bit_islem_or = 3 | 5
bit_islem_xor = 3 ^ 5
puts "BİT İŞLEM OPERATÖRLERİ"
print "& Operatörü: 3 & 5 = ", bit_islem_ampersand, "\n"
print "| Operatörü: 3 | 5 = ", bit_islem_or, "\n"
print "^ Operatörü: 3 ^ 5 = ", bit_islem_xor, "\n"
# Aritmetik işlem operatörleri esasında bir method çağrısıdır
aritmetik_operator_cagrisi = 2.+(2)
puts "Nesneden sonra . koyarak o nesnenin methodunu çağırabiliriz. () içerisine da parametre alır: 2.+(2)", aritmetik_operator_cagrisi
# Özel değerler de birer nesnedirler
ben_bir_nil_degerim = nil # ki kendisi diğer dillerdeki null değerinin karşılığıdır
ben_dogruyum = true # Doğru: Diğer dillerden farklı olarak 0 da "" gibi boş string ya da boş dizi vs true bir değerdir.
php_rubyden_iyidir = false # Yanlış
puts "MANTIKSAL DEĞERLER"
puts "Doğru: #{ben_dogruyum}\nYanlış: #{php_rubyden_iyidir}\nNil: #{ben_bir_nil_degerim}" # string interpolation için: #{} Ayrıca \n yeni satır başlatır
puts "nil nesnesinin sınıfı: ", nil.class
puts "true nesnesinin sınıfı:", true.class
puts "false nesnesinin sınıfı: ", false.class
# KARŞILAŞTIRMA OPERATÖRLERİ
# Eşitlik ==
# deger == diger_deger # => true ya da false döner
print "2 == 2 # => ", 2 == 2, "\n" # => true
print "4 == 2 # => ", 4 == 2, "\n" # => false
# Eşit Olmama !=
# deger != diger_deger # => true ya da false döner
print "1 != 1", 1 != 1, "\n" #=> false
print "2 != 1", 2 != 1, "\n" #=> true
# false nesnesinin kendisi hariç nil falsey değerli tek nesnedir # => diğer her şey true döner
puts "not ya da ! operatörü mantıksal değerin tersini döndürür :)"
puts " not 0: ", !0 # => false # Sıfırın değili(not) diğer bir ifade ile ! false çünkü sıfırın kendisi true
puts "!false: ", !false # => true
puts "!nil: ", !nil # => true
# Büyüklük karşılaştırmaları
puts "1 > 1000 #=> ", 1 > 100 # => false
puts "1 > 0 #=> ", 1 > 0 # => true
puts "1 < 100 #=> ", 1 < 100 # => true
puts "1 < 0 #=> ", 1 < 0 # => false
# Kombine karşılaştırma operatörü
puts "1 <=> 2", 1 <=> 2 # => -1 # başka bir değişle 1 in sırası 2 den öncedir
puts "2 <=> 1", 2 <=> 1 # => 1
puts "1 <=> 1", 1 <=> 1 # => 0
# Mantıksal operatörler
puts "true && false", true && false # => false # && ancak iki taraf da true ise true döner
puts "true || false", true && false # => true # || ancak iki taraf da false ise false döner
puts "!true", !true # => false
puts "!false", !false #=> true
# Soru işareti ile biten methodlar true ya da false döner
puts "2 çift mi?", 2.even?
puts "2 tek mi?", 2.odd?
puts "3 çift mi?", 3.even?
puts "3 tek mi?", 3.odd?
# MANTIKSAL OPERATÖRLERİN ALTERNATİFLERİ
# && için: and
# || için: or
# ! için: not
# String veri türü de bir NESNEDİR!
abbas_string = "Ben, bir koca string, aynı zamanda nesneyim. Yaaaaa, naber!"
puts "'Ben, bir koca string, aynı zamanda nesneyim. Yaaaaa, naber!' string nesnesinin sınıfı: ", abbas_string.class
# "" işeretleri içerisinde tanımlanmış string içinde string interpolation ve özel ifadeler dikkate alınır: \n ifadesi gibi
# '' işaretleri içerisinde tanımlanmış string ham bir string olarak değerlendirilir
nedir_bu_string_interpolation = "Herkese benden bir string interpolation"
puts "#{nedir_bu_string_interpolation} ama Şakir'e string interpolation yok!"
# String interpolation benzeri bir kullanım olmadıkça '' tercih edin
# Stringleri birbiri ile birleştirebiliriz
# ama bir sayı ile doğrudan birleştiremeyiz
ismim = 'Gökhan ' + 'ÇAĞLAR' # Bu doğru bir kullanım
# ama 'yaşım: ' + 35 TypeError hatası döndürecektir
# to_s metodu ile bir sayıyı string olarak dönüştürebiliriz
yasim = 'yaşım: ' + 35.to_s
puts "Merhaba, benim ismim #{ismim} ve #{yasim}"
# Ancak * operatörü ile stringler tamsayılarlarla etkileşebilir
cs_1_6 = 'Go! ' * 3
puts "In game start: ", cs_1_6
# String nesneleri << (shovel operatörü de denir) birleştirebiliriz
el_classico = "Merhaba, " << "Dünya!"
puts el_classico
# puts (ki put string olarak düşünün açılımını) değerinin sonuna bir yeni satır başlangıcı ekler: \n
puts "Aşağıdakilerden hangisi aşağıdadır: "
puts "Kendinden sonra gelen string çıktıları aşağılıyorsun demek!"
# print ise stringin işine veya sonuna karışmaz diyelim
print "Benim adım: "
puts "Gökhan ÇAĞLAR, benden sonrası"
puts "yeni satır!"
print "\\n den sonrası\nda yeni satır ama burdan sonrası "
print "yeni satır değil :("
puts "" # yeni satır
# DEĞİŞKENLER
# = işareti ile bir isme bir değeri atarız böylece o isim o değeri referans gösterir
bir = 1 # bir isimli değişkene 1 tamsayı değerini atadık
puts "bir isimli değişkenin değeri: ", bir
yedi = bir + 6
puts "1 + 6 = ", yedi
# Bir değişken adı uzadıkça yılan gibi uzar
bir_degisken_adi_uzadikca_yilan_gibi_uzar = "bir_degisken_adi_uzadikca_yilan_gibi_uzar = ama siz yine de 'Aydın Havası' gibi kısa kesin."
puts bir_degisken_adi_uzadikca_yilan_gibi_uzar
# Oluşturdunuz değişken adları açıklayıcı olsun
# 2.4 sürümü ve sonrasında Türkçe karakterleri değişken adlarında sorunsuz kullanabilirsiniz
# ancak tavsiye etmem
kalbe_giden_yol = "sevgi ve saygı"
yolun_gectigi_yer = kalbe_giden_yol + "dan"
kimin_kalbine_giden_yol = "Benim kalbime giden yol"
puts "#{kimin_kalbine_giden_yol} #{yolun_gectigi_yer} geçer."
# Semboller (symbol) Ruby dilinin kendine has veri türüdür
# Semboller değiştirilemez(immutable) tekrar kullanılabilen
# içerdikleri bir tamsayı değer ile gösterilen sabitlerdir.
durum = :beklemede
print "Durum değişkeni :beklemede sembolune refarans ve sınıfı: ", durum.class, "\n"
print "durum == 'beklemede' # => ", durum == 'beklemede', "\n" # 'beklemede' stringi ile :beklemede sembolu aynı şey değildir
# DİZİLER
# Diziler aynı veya farklı türlerde bir veya birden fazla değeri içeren değer serileridir diyebiliriz
# dizi itemleri [] işaretleri içerisinde tanımlanır.
# İçerilen değerler 0'dan başlayıp endekslenerek tutulur ve bir dizideki değere endeks sayısı ile erişiriz
# dizi[0] # => dizinin içerisinde tutulan ilk değeri döner
dogum_tarihi = [1982, 1, 4]
print "Doğum yılım: ", dogum_tarihi[0], "\n"
en_sevdigim_diziler = [1, 'Doctor Who', 2, 'American Gods', 3, 'Game Of Thrones', 4, 'Orange Is New Black']
puts "Sırası ile en sevdiğim diziler".upcase # upcase methodu string içerisindeki bütün karakterleri büyük harf yaptı
print "#{en_sevdigim_diziler[0]}. sırada #{en_sevdigim_diziler[1]}, "
print "#{en_sevdigim_diziler[2]}. sırada #{en_sevdigim_diziler[3]}, "
print "#{en_sevdigim_diziler[4]}. sırada #{en_sevdigim_diziler[5]}, "
print "#{en_sevdigim_diziler[6]}. sırada #{en_sevdigim_diziler[7]} isimli dizilerdir.\n"
kostekli_saat = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# Soldan sağa dizi endeksini almak
puts "kostekli_saat isimli değişkende tutulan dizinin ilk değeri: ", kostekli_saat[0] # => 1
puts "kostekli_saat isimli değişkende tutulan dizinin ilk değeri: ", kostekli_saat.first # => 1
# [] sadece bir method çağrısıdır yani şöyle de yazılabilir:
puts "kostekli_saat isimli değişkende tutulan dizinin ilk değeri: ", kostekli_saat.[](0) # => 1
# Sağdam sola dizi endeksini almak
puts "kostekli_saat isimli değişkende tutulan dizinin son değeri: ", kostekli_saat[-1]
puts "kostekli_saat isimli değişkende tutulan dizinin son değeri: ", kostekli_saat.last
puts "kostekli_saat isimli değişkende tutulan dizinin son değeri: ", kostekli_saat.[](-1)
# Eğer dizi sınırları dışına çıkarsak nil değeri döner
print "Dizinin sınırları dşındaki bir endeksin değerini sorgularsak dönen: ", kostekli_saat[13], "\n" # => nil
# Dizlerin belli bir aralığını almak istersek
# dizi[başlangıç_endeksi, alınacak item sayısı]
print "3. endeksten itibaren 5 item al: ", kostekli_saat[3, 5], "\n" # => [4, 5, 6, 7, 8]
# Bir diziyi tersine çevirme
# değişiklikleri değişken değerinin üzerine yazdıran için method ismi sonunda ! işareti bulunur
print "Diziyi tersine çevirdik: ", kostekli_saat.reverse, "\n"
dijital_saat = [24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13]
# String ile olduğu gibi << operatörü diziye değer eklemek için kullanılabilir
dijital_saat << kostekli_saat.reverse # => [24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
dijital_saat.reverse!
print "dijital_saat: ", dijital_saat, "\n"
print "kostekli_saat: ", kostekli_saat, "\n"
# range ile de bir dizideki değerler aralığını döndürebiliriz
print en_sevdigim_diziler[0..4], "\n" # Sıfırdan başlayarak 4. iteme kadar bir dilim aldık
# item eklemek için push method çağrısını da kullanabilirsiniz
en_sevdigim_diziler.push(5)
en_sevdigim_diziler.push("Lost Room")
# Bir dizinin bir değeri içerip içermediğini include?() method çağrısı ile kontrol ederiz
puts "kostekli_saat 12 değerini içeriyor mu? ", kostekli_saat.include?(12) # => true
puts "kostekli_saat 24 değerini içeriyor mu? ", kostekli_saat.include?(24) # => false
# pop() ile dizinin sonundaki itemi silebiliriz
# shift() ile dizinin ilk itemini sileriz
# unshift() ile dizinin başlangıcına item ekleriz
# ya da dizi[endeks_numarasi] = deger şekilnde item eklenebilir
# Ruby Dilinde anahtar => değer eşleştirmeleri hash olarak adlandırlılır
# hash itemleri {} işaretleri içerisinde tanımlanır.
canta = {"renk" => "siyah", :hammadde => "deri", "adet" => 1}
print "canta degişkenine atanan hash: ", canta, "\n"
# değerlere erişmek için [] method çağrısına anahtar değer parametre olarak verilir
puts "çanta hash değişkenindeki değerler".capitalize # capitalize method çağrısı ile string içindeki her bir kelime grubu büyük harf ile başlayacak
puts "Çanta rengi: ", canta["renk"]
print "Bu bir ", canta[:hammadde], " çanta", "\n"
puts "Çanta Adedi: ", canta["adet"]
# Sembolleri anahtar olarak tanımlamak hem daha pratik hem daha performanslıdır
musteri = {isim: "Gökhan", soyad: "ÇAĞLAR", yas: 35}
print "Müşteri: ", musteri, "\n"
print "Müşteri Adı: ", musteri[:isim], "\n"
# Var olmayan bir anahtarı sorgularsak nil değeri döner
puts musteri[:super_power] # => nil
# Değer eklemek için
musteri[:super_power] = 'Uçmak'
puts musteri[:super_power]
# İki farklı hash değerini birleşitirmek için merge() method çağrısı kullanılabilir
# keys methodu HASH içerisindeki anahtarları dizi olarak döner
print "musteri için anahtar değerleri: ", musteri.keys, "\n"
# haliyle values methodu da hash içerisindeki değerleri dizi olarak döner
# Bir hash içinde anahtar ya da değerin var olup olmadığı kontrol edilebilir.
puts "musteri değişkeninde :isim anahtarı var: ", musteri.key?(:isim)
puts "musteri değişkeninde 'Gökhan' değeri var: ", musteri.value?('Gökhan')
# Hem diziler hem hashler Enumerable verilerdir
# Enumerable modülünden pek çok methodla enumarator döndürebilirler
# başlıcaları: each, each_with_index, each_pair, map, count, reduce, inject
# İleride değinmeye çalışacağım
# Akış Kontrolleri
#if true
# "Bu blok çalıştırılacak"
#elsif baska_bir_true
# "bu blok çalıştırılacak"
#else
# "hiç biri olmazsa bu blok çalıştırılacak"
#end
bir_deger = 18
if bir_deger > 16 && bir_deger < 18
puts "Ehliyet alabilir ama bara gidemez."
elsif bir_deger < 16 && bir_deger >= 12
puts "Ergenlik zor zanaat"
elsif bir_deger < 12
puts "Gezme ve oyun zamanları"
else
puts "Ne isterse yapar"
end
# Ruby dilinde if not true ifadesine alternatif olarak unless true ifadesi vardır
# unless genellikle else içermeyen durumlara karışılık kullanılır
# Bir akış kontrolünün döndüğü değer bir değişkene atanabilir
kisi = 'Gökhan'
izlenim = if kisi == 'Gökhan'
'Yakışıklı'
else
'Eh!'
end
# RUby tenarry operatorunu destekler
detay = kisi == 'Gökhan' ? 'akıllı' : 'Zamanla Anlaşılır'
puts "#{kisi} #{izlenim} ve #{detay} bir adam."
# Iterasyon
# for ile bir dizi ya da range itemleri ile iterasyon yapılabilir
for sayac in 1..10
puts "Saklanbaç: #{sayac}"
end
# => Saklanbaç: 1
# => Saklanbaç: 2
# => Saklanbaç: 3
# => Saklanbaç: 4
# => Saklanbaç: 5
# => Saklanbaç: 6
# => Saklanbaç: 7
# => Saklanbaç: 8
# => Saklanbaç: 9
# => Saklanbaç: 10
# range oluşturuken ... kullanırsanız son değer hariç tutulur
# örnek: (1...9) # Son Enumarator Değeri: 8
# to_a method çağrısı ile range bir diziye dönüştürülebilir
# each dizilerin, rangelerin vb. her bir itemini bir kere blok içerisinde döndürür
# bir blok kod grubu alanı olarak düşünülebilir
(1...6).each do |sayac|
# sayac sozde değişkeni sadece blok içerisinde varlığını sürdürür
puts "Sayaç: #{sayac}"
end
# => Sayaç: 1
# => Sayaç: 2
# => Sayaç: 3
# => Sayaç: 4
# => Sayaç: 5
# while ile klasik bir döngü oluşturabilirsiniz
# continue ifadesi yerine next kullanılır
# break ile döngüden çıkılabilir
bir_sayac = 0
baska_bir_sayac = 10
while bir_sayac < 10
print "#{bir_sayac} "
bir_sayac += 1
end
puts # Yeni satır
# Sonsuz döngü
loop do
print "#{baska_bir_sayac} "
baska_bir_sayac -= 1
break if baska_bir_sayac == 0
end
# Ayrıca while not true alternatifi olarak until true kullanılabilir
# {} içerisinde de kod bloğu oluşturulabilir
dizi = (1..20).to_a
print "dizi değişkeninin sınıfı: ", dizi.class, "\n"
dizi.each { |sayac| puts "Başka Bir Sayaç: #{sayac}" }
# Ruby Dili daha önce de belirttiğim gibi pek çok döngü methodu barındırır
baska_bir_dizi = [3, 5, 7, 9, 11]
katmerlendi = baska_bir_dizi.map { |i| i * 2 }
print "Dizi: ", baska_bir_dizi, "\n"
print "Katmerlenmiş değerler dizisi: ", katmerlendi, "\n"
# Switch case mahdumlarına gelsin: case
# Evet! Ruby Dilinde case var
puan = 'C'
case puan
when 'A'
puts "Aferin len!"
when 'B'
puts "Üzülme! hiç kötü değil..."
when 'C'
puts "Gelecek sefere daha iyisini yaparsın"
when 'D'
puts "'Beterin beteri var!'"
when 'E'
puts "ÇALIŞ BİRAZ!"
when 'F'
puts "KALDIN!"
else
puts "Yalnış not sistemine göre not girişi yaptın!"
end
# HATA YAKALAMA
# Ruby Dili de c#, java ve python vb. dilleri gibi
# Error Handling imkanı sunar
begin
# Burada bir hata raise edelim
raise TypeError, 'Bu ne biçim tip yahu!'
rescue TypeError => exception_degiskeni
puts 'Tip hatası döndü ama yakaldım. Hey be tipini seveyim!', exception_degiskeni
rescue RuntimeError => diger_exception_degiskeni
puts 'RuntimeError varsa ben yakalarım abi', diger_exception_degiskeni
else
puts 'Hiç bir hata yakalanmadı ama ben yine de hatasız kul olmaz mesajımı yazacağım. Hata varsa ben susacağım.'
ensure
puts 'Hata olsa da olmasa da ben çalışırım arkadaş.'
end
# Fonksiyonlar ve diğer tüm bloklar içerdikleri son satırdaki değeri dönerler
# Ruby Dilinde isimsiz fonksiyon tanımlamaları oluşturmak için Proc ve Lambda vardır
# Proc lambdadan farklı olarak fazladan gelen parametre varsa dikkate almaz ve hata döndürmez
# p = Proc.new { |x| x * 2 }
# Ruby dilinde bir fonksiyon ya da lambda ya da proc değişkene atanabilir
# Çağrılarda parametre vermek için degisken_adi[paramatre] ya da degisken_adi.call(parametre)
# sözdzimi kullanılır
katmerle = ->(x) { x * 2 } # LAMBDA
puts katmerle[4] # Lamba çağırma yollarından biri. Diğeri: katmerle.call(4)
# Fonksiyonlar def ifadesi ile tanımlanır ve end ile sonlanırlar
def ikile(x)
x * 2
end
puts ikile(8)
# İç içe çağrı
puts ikile(ikile(8))
puts katmerle.call(katmerle[16])
def topla(x, y)
x + y
end
puts topla(80, 48)
puts topla(topla(80, 48), 128)
# yield
# Tüm methodlar kendiliğinden optional bir blok parametresi kabul eder
def eko
puts '*' * 40
10.times { yield }
puts '*' * 40
end
eko { puts 'EKO!' }
# Bir fonksiyona parametre olarak blok geçebilirsiniz
# & kendinden önce bu ampersand işareti ile belirtilir
mesaj = ->(x) { puts "Merhaba, #{x}!" }
def selamla(&msj)
msj.call 'Dünya'
end
selamla(&mesaj)
# Önceden tahmin edemeyeceğimiz sayıda argüman alacaksa fonksiyon
# * işareti ile seri argüman geçebiliriz
def beyaz(*args)
args.each { |konuk| puts "O biivvv #{konuk}" }
end
# Pythonda olduğu gibi birden fazla öngörülemeyen sayıda anahtar değer parametre göndermek de mümkündür
def anahtarlar_degerler(**kvargs)
kvargs.each_pair do |k, v|
puts "Anahar: #{k} => Değer: #{v}"
end
end
eski_bir_hash = {birinci: 1914, ikinci: 1945}
anahtarlar_degerler(**eski_bir_hash)
# Dizi dönen bir methodu parelel atama için kullanabilirsiniz
def muhtesem_uclu
['Metin', 'Ali', 'Feyyaz']
end
m, a, f = muhtesem_uclu
puts m, a, f
# SINIFLAR
class Insan
attr_accessor :isim # isim için gether ve sether otomatik oluşturulacak
# attr_reader sadece getter oluşturur
# attr_writer sadece setter oluşturur
@@tur = 'Homo Sapiens'
@@nufus = 0
# Nesne inşa edici
def initialize(isim, yas = 0)
@isim = isim
@yas = yas
@@nufus += 1 # @@nufus = @@nufus + 1 ifadesinin kısa yazımı
end
# Setter method
def yas=(y)
if y.is_a?(Integer) && y > 0
@yas = y
else
puts "Lütfen sıfırdan büyük bir tamsayı giriniz!"
end
end
# getter method
def yas
@yas
end
# Bir sınıf methodu self kullanılarak tanımlanır
# Instance üzerinden değil doğrudan sınıf üzerinden çağrılabilir
def self.der_ki(msj)
puts msj
end
def self.nufus
@@nufus
end
# Bir instance method nesne örneği üzerinden çağrılır
# Nesnenin davranışıdır
def tur
@@tur
end
end
# Bir mesme inşa edelim
ust_insan = Insan.new('Gökhan ÇAĞLAR')
insan = Insan.new('Şakir')
insan.isim = 'Şener'
puts insan.isim
ust_insan.yas = 'Otuz beş'
puts ust_insan.yas
ust_insan.yas = 35
puts ust_insan.yas
ust_insan.tur
# Bir sınıf methodu çağıralım
Insan.der_ki('Seviyorsan git konuş bence.')
puts Insan.nufus
# Moduller
# Moduler diğer dillerdeki name space gibi kullanılabilir
# İçlerinde başka sınıfları, methodları ve hatta modulleri de barındırabilir
# Ruby Dili çoklu kaltımı kullanmadığından Mixin oluşturmada da kullanılabilirler
module BildiginNameSpace
def foo
'bar'
end
def bar
'baz'
end
end
# Değişken tanımlamalarında gördüğümüz @ işareti o değişkenin bir sınıf niteliği değişkeni yani iinstance variable olduğunu belirtir
# Aynı şekilde değişken isminin başına $ işareti koyarak bir global değişken tanımlayabiliriz.
# @@ işareti ile de bir sınıf değişkeni tanımlarız (javadaki ya da c# dilindeki static gibi düşünebilirsiniz)
# Ruby dilinde sınıfın kendisi de bir nesnedir.
# Kalıtım
class Isci < Insan
include BildiginNameSpace
attr_reader :is
def initialize(isim)
super
@is = 'Tamirci çırağı'
end
end
class Usta < Isci
def initialize(isim)
super
@is = 'Tamirci'
end
def emir
puts 'Oğlum!.. al takımları :)'
end
end
cem = Isci.new('Cem')
usta = Usta.new('Karaca')
puts cem.is
puts usta.is
usta.emir
cem.yas = 40
cem.yas = 'sonsuz'
usta.yas = 50
usta.yas = 'yaşlı'
puts "Yaş niteliklerini bir kontrol edelim"
print 'Cem Yaş: ', cem.yas, "\n"
print 'Usta Yaş: ', usta.yas, "\n"
puts 'Moduldeki methodları çağıralım'
puts cem.foo
puts usta.bar
# include ve extend
# Bir sınıfa modulu include ile aktarırsak o sınıfın örnekleri de module erişebilir
module BirBaskaNameSpace
def self.included(base)
base.extend(ClassMethods)
base.send(:include, InstanceMethods)
end
module ClassMethods
def baz
'foo bar baz'
end
end
module InstanceMethods
def barbaz
[:bar, :baz]
end
end
end
class BilmemBirSey
include BirBaskaNameSpace
end
BilmemBirSey.baz
# BilmemBirSey.barbaz # => NoMethodError: undefined method 'barbaz'
# BilmemBirsey.new.baz NoMethodError: undefined method 'baz'
BilmemBirSey.new.barbaz # => [:bar, :baz]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment