2020-09-03 21:23:03 +00:00
---
filename: learnruby-tr.rb
contributors:
- ["Seçkin KÜKRER", "https://github.com/LeaveNhA"]
---
Ruby, doğrudan bir Google araması yla aklı nı zdakini bulmanı z zor olabilir. İngilizce bu kelime, `Ruby` (IPA: ˈ ruː bi) "kı rmı zı taş" anlamı na gelen Fransı zca kökenli bir kelime olan `rubi` 'den gelmektedir.
2024-05-19 09:27:05 +00:00
Yaratı cı sı tarafı ndan, yine esinlenilen bir dil olarak ortaya çı kan `Ruby` , Perl, Smalltalk, Eiffel, Ada, Lisp programlama dillerinin en iyi özelliklerini almı ştı r. ! İmperativ programlama mentalitesi üzerine kurmayı seçtiği bu teknoloji, günümüzde sektöründe öncü.
2020-09-03 21:23:03 +00:00
## Tarihçe
Ruby 1995’ te halka duyurulduğundan beri, dünya çapı nda programcı ları n dikkatini çekmeye başlamı ştı r. 2006 Ruby’ nin altı n yı lı olmuştur. Dünyanı n en büyük şehirlerinde aktif kullanı cı grupları ve Ruby ile ilgili konferanslar gerçekleştirilmiştir.
Daha sonraları `Ruby` , dünya çapı nda programlama dillerinin büyümesini ve popülaritesini ölçen dizinlerin (TIOBE dizini gibi) çoğunda ilk 10 içinde yer almı ştı r. Büyümenin çoğu, Ruby ile yazı lmı ş yazı lı mları n popülaritesiyle ilgilidir, özellikle de Ruby on Rails web çatı sı yla.
## Sektördeki Konumu ve Geleceği ?
Çoğu uzmana göre, şu anda sadece `Rails` teknolojisi için bir betik dili olarak sı kı şmı ş durumda.
Bazı ları ise, dilin kendi geleceğini, 2020 içinde yayı nlanması planlanan `Ruby 3` ile sağlamlaştı racağı nı ve yeni imkanlar ve sektörek kullanı m ve tercihler ile popüleritesinin artacağı nı düşünüyor.
## Her Şey Nesne
Matz'ı n incelemiş olduğu diller sonucunda, teknik olarak en iyi sözdizimin kaynağı nı “Perl’ den daha güçlü ama Python’ dan daha nesneye yönelik bir betik dili” olarak tanı mlamı ş.
Her şeyin Nesne olarak görüldüğü bir programlama teknolojisi, bütünlük kavramı açı sı ndan herkese kucak açan bir pürüzsüzlük sunuyor. `Ruby` 'nin neden tartı şması z, saf bir Nesne yönelimli bir programlama dili olduğuna dair örnekleri aşağı da vereceğim.
## Diğer Gerçeklemeler
- [JRuby ](http://jruby.org/ ), JVM’ in (Java Virtual Machine) üstünde çalı şan Ruby’ dir, JVM’ in eniyileyen JIT derleyicisi, çöp toplayı cı sı , eşzamanlı thread’ leri, araç ekosistemi, ve muazzam sayı daki kütüphanelerinden faydalanı r.
- [Rubinius ](http://rubini.us/ ), ‘ Ruby’ da yazı lmı ş Ruby’ dir’ . LLVM’ in üstüne inşa edilmiştir ve ayrı ca diğer dillerin üstüne inşa edebilecekleri şı k bir sanal makine de sunar.
- [TruffleRuby ](https://github.com/oracle/truffleruby ), GraalVM’ in üstünde çalı şan yüksek performanslı bir Ruby gerçeklemesidir.
- [IronRuby ](http://www.ironruby.net/ ), “.NET Web Çatı sı ’ yla sı kı sı kı ya bağlı ” bir gerçeklemedir.
Diğer gerçeklemeler için, lütfen ileri okumaya danı şı nı z.
```ruby
# Bu karakter ile başlayan satı rlar, yorum satı rı olarak değerlendirilir.
# Diğer yorum satı rı tanı mlamaları için tanı mlamalar ve ifadeler kı smı na danı şı n.
## Örnek yapı sı ; bu örnek dosyadaki her Ruby ifadesi, Ruby yorumlayı cı sı
## tarafı ndan yorumlanarak sonucu `=>` ifadesinin sağı na yazı lı r.
## örnek ifade #=> örnek sonuç
## formatı ndadı r.
## Bazen satı r aşı mı nı önlemek için
## örnek ifade
## #=> örnek sonuç
## şeklinde yer verilecektir.
# --------------------------------
# Veriler ve Temsilleri
# --------------------------------
## --
## Sayı lar:
## --
### Ruby, tamsayı veri tipini destekler. Sayı sal değerlerin sisteminizdeki temsili
### bu veri yapı sı dı r.
# Tam sayı örneği.
2024-05-19 09:27:05 +00:00
1453 #=> 1453
2020-09-03 21:23:03 +00:00
## Okunabilirlik için, binlik ya da ondalı k kı smı nı `_` ile
## ayı rmak mümkündür ve bu karakter tümüyle görmezden gelinir.
3_14 #=> 314
## Negatif sayı lar `-` ile başlı yor.
-3750 #=> -3750
## Oktal sayı lar
03603 #=> 1923
## Onaltı lı k sayı lar
0x23B #=> 571
## İkilik sayı lar
0b11110000011 #=> 1923
## Büyük sayı lar temsili
12345678901234567890 #=> 12345678901234567890
## Kayan noktalı sayı lar
## Bir kayan-noktalı /Ondalı klı sayı .
3.14 #=> 3.14
## Bilimsel notasyon
1.0e3 #=> 1000.0
## Bir ipucu,
## üsten önce işaret!
3e+9 #=> 3000000000.0
## --
# Mantı ksal Değerler
## --
## Mantı ksal doğru ifadesi.
true #=> true
## Mantı ksal yanlı ş ifadesi.
false #=> false
## --
# Metinler
## --
## Metin sabitleri
'Bu, bir metin ifadesi.'
2024-05-19 09:27:05 +00:00
## Kaçı şlar için
2020-09-03 21:23:03 +00:00
'Kaçı şlar için "\\"' #=> "Kaçı şlar için \"\\\""
## Alternatif ise çift tı rnaklı ifadeler.
"Bu da bir metin ifadesi."
## Kaçı şlarda farkı ise,
"Kaçı lar için '\\'" #=> "Kaçı lar için '\\'"
## bazı kaçı ş notasyonları na gerek kalmaması .
## Bazı notasyon karakterleri
### Yeni Satı r (New Line 0x0a)
"\n" #=> "\n"
### Boşluk (Space 0x20)
"\s" #=> "\s"
## --
2024-05-19 09:27:05 +00:00
# Karakterler
2020-09-03 21:23:03 +00:00
## --
## Basitçe önlerine soru işareti getirilmiş
## tek karakter sabitleridir.
?a #=> "a"
## --
# Semboller
## --
2024-05-19 09:27:05 +00:00
## Ruby'de semboller, temsilleri bakı mı ndan
2020-09-03 21:23:03 +00:00
## Clojure'daki semboller ile benzerlerdir.
:sembol #=> :sembol
## Kendileri, birinci sı nı f değerdir.
:türk.class #=> Symbol
## Ve aynı zamanda Unicode desteği vardı r. (1.9 sürümünden beri)
## --
# Diziler
## --
## Basitçe, Ruby dizileri birilerinden virgül ile ayrı lmı ş,
## değer veya değer sahibi referansları n köşeli parantezler
## ile çevrelenmesi ile oluşturulur. ([])
[1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5]
## Metinler için de durum aynı .
["Mustafa", "Kemal", "ATATÜRK"] #=> ["Mustafa", "Kemal", "ATATÜRK"]
## Aynı zamanda, Ruby dizileri tip bağı msı z nesne ardı şı kları dı r.
[1881, "Mustafa", "Kemal", "ATATÜRK", 1923, "∞"]
## Aynı zamanda Unicode destekler (1.9 sürümünden beri)
## --
# Eşlemeler
## --
## Ruby eşlemeleri, süslü parantezler içinde virgül ile ayrı lan,
## anahtar ve değer ikililieridir.
## Bir tane de olabilir,
{"izmir" => "kı zları "} #=> {"izmir" => "kı zları "}
## Ya da, birden fazla...
{"izmir" => "kı zları ", "paris" => "sokakları "} #=> {"izmir" => "kı zları ", "paris" => "sokakları "}
## Aslı nda her değeri anahtar veya değer olarak
## yerleştirmek mümkün.
## Sembolleri,
{:zafer => "30 Ağustos!"} #=> {:zafer=>"30 Ağustos!"}
## Rakamları bile.
{28101923 => "Efendiler, yarı n Cumhuriyeti'i ilân edeceğiz!"}
#=> {28101923=>"Efendiler, yarı n Cumhuriyeti'i ilân edeceğiz!"}
## Semboller için ufak bir sözdizimsel şekerleme mevcut ki,
{istanbul: "beyefendi"} #=> {:istanbul=>"beyefendi"}
## Bu kullanı ma göre, sembol anahtarlar ile değerler arası na
## `=>` yerine basitçe sembolün başı na gelecek `:` sembolü
## getiriliyor.
## --
# Aralı klar
## --
## Ruby aralı kları temeliyle başlangı ç ve bitiş
## değerleri arası ndaki aralı ğı n veriye dönüştürülmesi
## için bir dil olanağı dı r.
## (başlangı ç..bitiş) notasyonu kullanı labilir.
(0..10) #=> 0..10
## REPL'ı n bize verdiği ifade sizi yanı ltması n, bu bir aralı ktı r.
## Meraklı ları yla, dökümanı n devamı nda içindeki değerleri
## gezeceğiz.
## Range.new notasyonu ile de ilklenebilirler.
Range.new(0, 10) #=> 0..10
## --
# Düzenli İfadeler
## --
## İki / operatörünün ortası na tanı mlanı rlar.
//.class #=> Regexp
## Örnek bir düzenli ifade, a harfi için.
/[a]/ #=> /[a]/
# --------------------------------
# Değelerin Manipüle edilmesi
# --------------------------------
## --
## Rakamlar
## --
## Aritmatik, bildiğimiz şekilde.
## !! infix notasyon
235 + 1218 #=> 1453
123 - 35 #=> 88
2 * 2 #=> 4
1 / 1 #=> 1
## Bit tabanlı işlemler.
2 & 5 #=> 0
3 | 9 #=> 11
2 ^ 5 #=> 7
## Aslı nda C tipi ailesi dillerdeki gibi. Sezgisel bir yaklaşı mla, hayatta kalı nabilir.
## Ama yine de dökümantasyona başvurulması nı tavsiye ederim.
## --
## Mantı ksal
## --
## ! operatörü teklidir, ve aldı ğı değerin mantı ksal tersini alı r.
!true #=> false
!false #=> true
## --
## Metinler
## --
### Boş mu ?
"".empty? #=> true
### Bir bölümünü alalı m.
"Ölürüm TÜRKİYEM!".slice(7, 7) #=> "Türkiye"
## Bir başka şekilde, indis notasyonu ile,
"Ölürüm Türkiye'm!"[7, 7] #=> "Türkiye"
## Küçük harfe dönüştürelim
"LAY-LAY-LOM sana göre sevmeler...".downcase
#=> "lay-lay-lom sana göre sevmeler..."
## Büyük harfa dönüştürelim
"beşiktaş".upcase #=> "BEŞIKTAŞ"
## Karakterlerine ayı ralı m
"BEŞİKTAŞ".chars #=> ["B", "E", "Ş", "İ", "K", "T", "A", "Ş"]
## Çevrelemek için
"Ahmet Mete IŞIKARA".center(30)
#=> " Ahmet Mete IŞIKARA "
## İçerik kontrolü için include metodu
"aşk".include?(?a) #=> true
## argümanı metin tipinde de verebilirdik, ama
## yukarı daki temsillerde gördüğümüz gibi,
## yorumlayı cı , karakter sabitini metin olarak işliyor zaten.
## Konumunu alalı m.
"Dayı ".index("a") #=> 1
## Elbette, tasarı mı nda sağlı klı kararlar alı nmı ş her
## dil gibi, Ruby'de 0'dan saymaya başlı yor.
## Metin yerleştirme yapalı m
"Ali Baba'nı n x çiftliği var.".sub("x", "bir")
#=> "Ali Baba'nı n bir çiftliği var."
## Birden fazla eşleşme için, değiştirme yapalı m
"Dal sarkar x kalkar, x kalkar dal sarkar.".gsub("x", "kartal")
#=> "Dal sarkar kartal kalkar, kartal kalkar dal sarkar."
## Düzenli ifadeler ile, cümledeki sesli harfleri değiştirelim.
"Bir berber bir bere...".gsub(/[ie]/, "*")
#=> "B*r b*rb*r b*r b*r*..."
## Diğer işlevler için ileri okumadaki kaynağa başvurunuz.
## --
## Eşlemeler
## --
## basit bir eşleme ile başlayalı m.
{:boy => 1.74} #=> {:boy => 1.74}
## Belirli bir anahtar, eşlememizde barı nı yor mu diye
## kontrol ediyoruz.
{:boy => 1.74}.has_key? :boy
#=> true
## Parantezlerin yokluğu sizi yanı ltması n,
## bu bir fonksiyon çağı rı sı dı r.
## Eşlemeden veri çekiyoruz
{:boy => 1.74}.fetch :boy
#=> 1.74
## Eşlemelere veri ekliyoruz
{:boy => 1.74}.merge!(kilo: 74)
#=> {:boy=>1.74, :kilo=>74}
## Anahtarları mı za bakalı m
{:boy=>1.74, :kilo=>74}.keys
#=> [:boy, :kilo]
## Değerlerimize bakalı m
{:boy=>1.74, :kilo=>74}.values
#=> [1.74, 74]
## Dizi olarak almak istersek
{:boy=>1.74, :kilo=>74}.to_a
#=> [[:boy, 1.74], [:kilo, 74]]
## Endişelenmeyin, dönüşümler için koca bir bölüm
## ayı rdı m.
## --
## Diziler
## --
## Örnek bir dizi ile başlayalı m.
["Mustafa", "Kemal", "ATATÜRK"]
#=> ["Mustafa", "Kemal", "ATATÜRK"]
## İlk değeri alı yoruz
["Mustafa", "Kemal", "ATATÜRK"].first
#=> "Mustafa"
## Son Değeri,
["Mustafa", "Kemal", "ATATÜRK"].last
#=> "ATATÜRK"
## Indis araması için `fetch` metodu.
["Mustafa", "Kemal", "ATATÜRK"].fetch 1
#=> "Kemal"
## Var olamyan bir indis ararsak hata alı yoruz.
## Fakat seçimli ikinci argüman bize indisin
## bulunamaması halinde döndürülecek değeri
## belirleme imkanı veriyor.
["Mustafa", "Kemal", "ATATÜRK"].fetch 20101927, "Nutuk"
#=> "Nutuk"
## Birden fazla değer almak için, slice metodunu
## kullanabiliriz
["Fatih", "Sultan", "Mehmet"].slice 1..2
#=> ["Sultan", "Mehmet"]
## Ya da, indis notasyonu da kullanı labilir.
["Fatih", "Sultan", "Mehmet"][1..2]
#=> ["Sultan", "Mehmet"]
## Baştan n tane eleman almak için take metodunu kullanı yoruz
["Fatih", "Sultan", "Mehmet"].take 2
#=> ["Fatih", "Sultan"]
## Rastgele bir dizi elemanı elde etmek için sample metodunu
## kullanı yoruz
["Fatih", "Sultan", "Mehmet"].sample
#=> "Fatih"
## `sample` metodu seçimli bir argüman kabul eder.
## bu argüman rastgele istenen eleman sayı sı nı temsil eder
["Fatih", "Sultan", "Mehmet"].sample 2
#=> ["Fatih", "Sultan"]
## Aradı ğı nı z eleman, dizide var mı kontrolü için
## include? metodu kullanı lı yor
["Fatih", "Sultan", "Mehmet"].include? "Fatih"
#=> true
## Dizinizdeki elemanları koşul dahilinde seçimlemek için
## select metodunu kullanı yoruz
["Fatih", "Sultan", "Mehmet"].select {|s| s.include? ?a}
#=> ["Fatih", "Sultan"]
## Süzme işleminin koşulu, a karakteri içeren nesneler için olumlu.
## Not: filter metodu, select için bir takma addı r.
## Ters bir yöntem, süzgeçleme için ise;
["Fatih", "Sultan", "Mehmet"].reject {|s| s.include? ?a}
#=> ["Mehmet"]
## koşulumuz aynı ydı , seçimleme metodumuzu değiştirdik.
### Yapı sal düzenlemeler için:
## Dizileri ters çevirmek,
["Fatih", "Sultan", "Mehmet"].reverse
#=> ["Mehmet", "Sultan", "Fatih"]
## Sı ralamak için sort metodu,
["İş", "Aşk", "Para"].sort
#=> ["Aşk", "Para", "İş"]
## Ön koşulla sı ralamak için,
["İş", "Aşk", "Para"].sort {|a,b| b < => a }
#=> ["İş", "Para", "Aşk"]
## Koşulumuz basitçe tersine sı ralamak için bir tanı mdı r.
## ileride karşı laştı rma operatörlerini göreceğiz.
## Tekrarlı elemanları n temizlenmesi için
[1,2,3,4,5,6,7,1,2,4,1,5,6,1,2,5].uniq
#=> [1, 2, 3, 4, 5, 6, 7]
## Dizilerin birleştirilmesi için
[1,2] + [3,4]
#=> [1, 2, 3, 4]
## infix notasyon sizi yanı ltması n,
## tasarı mı gereği, her şey sı nı flar ve metotları na çağı rı m
## olarak yürüyor.
## Kanı tlayalı m;
[1,2].+([3,4])
#=> [1, 2, 3, 4]
## Peki ya aynı elemanları içerebilecek dizileri birleştirmek
## istersek ?
[1,2] | [2,3,4]
#=> [1, 2, 3, 4]
## | operatörü bizi, nihai sonuçtaki tekrarlı veriden koruyor.
2024-05-19 09:27:05 +00:00
## Peki ya bir diziyi, eleman bazı nda diğeriyle
2020-09-03 21:23:03 +00:00
## süzmek istersek ?
[1,2] - [2,3,4]
#=> [1]
## Notasyon sizi yanı ltması n, Küme gibi davranan bir dizi işlevi.
### Veri Dönüşümleri için:
## Dizideki her elemana uygulamak istediğiniz bir
## dönüşümü, map metodu ile uygulayabilirsiniz,
["Kontak İsmi",
"Kontak Telefon Numarası "].map {|element| "< label > #{element}< / label > "}
#=> ["<label>Kontak İsmi</label>", "<label>Kontak Telefon Numarası </label>"]
## HTML konusu için yine LearnXinYminutes'e danı şabilirsiniz.
## Son elde ettiğimiz veriyi birleştirmek için,
["< label > Kontak İsmi< / label > ",
"< label > Kontak Telefon Numarası < / label > "].join ""
#=> "<label>Kontak İsmi</label><label>Kontak Telefon Numarası </label>"
## Veriyi indirgemek için ise reduce metodu kullanı rı z,
["< label > Kontak İsmi< / label > ",
"< label > Kontak Telefon Numarası < / label > "]
.reduce("") {|akümülatör, veri| akümülatör + veri}
#=> "<label>Kontak İsmi</label><label>Kontak Telefon Numarası </label>"
## Akümülatör, her operasyondan dönen ara-geçici değer.
## Bu değeri, parantez içinde ilkledik,
## eğer vermeseydik, dizinin ilk elemanı olacaktı .
## Tabi, daha kolay bir yolu var;
2024-05-19 09:27:05 +00:00
["< label > Kontak İsmi< / label > ",
2020-09-03 21:23:03 +00:00
"< label > Kontak Telefon Numarası < / label > "].reduce(:+)
#=> "<label>Kontak İsmi</label><label>Kontak Telefon Numarası </label>"
## reduce metodu, ikili bir operasyonu (akümülatör için metot!)
## sembol olarak vermenize izin verir ve bu, reduce için
## indirgeme fonksiyonu olarak kullanı lı r.
## Nüansları olsa da, son üç Ruby çağı rı mı aynı sonucu vermektedir.
## --
## Semboller
## --
## Ruby sembolleri, çalı şma zamanı nda değiştirilemezler.
## Ama metinsel değerlerden semboller elde etmek mümkündür.
## Bunu dönüşümler kı smı nda işlemek daha doğru olacak diye düşündüm.
# --------------------------------
# Dönüşümler
# --------------------------------
## --
2024-05-19 09:27:05 +00:00
# Rakamlar
2020-09-03 21:23:03 +00:00
## --
## Sayı sal değerlerin diğer tiplere dönüşümü;
## Sayı sal -> Metinsel
1923.to_s #=> "1923"
## Sayı sal -> Mantı ksal
!1923 #=> false
## Farkedebileceğiniz gibi,
## sayı sal değerler, mantı ksal doğru'ya değerlendiriliyor.
## Sayı sal -> Sembol
## Maalesef, Ruby bile Sayı sal değerden Sembol değerlerine
## doğrudan dönüşüm için metot barı ndı rmı yor.
## Bunu yine de başarmak istersek, değeri önce
## Metinsel'e dönüştürerek Sembol dönüşümü için hazı rları z.
1923.to_s.to_sym
#=> :"1923"
## Sayı sal -> Dizi | bölümlenerek
## Yine doğrudan bir dönüşüm yoktur.
## Böyle bir doğrudan dönüşüm teşvik de edilmez.
## Ama ihtiyaç olabilecek bir dönüşüm.
1923.to_s.split('')
#=> ["1", "9", "2", "3"]
## Öncelikle Metinsel dönüşüm yapı lı r, sonra
## her bir karakter için ayrı lı r.
## Yine her bir rakamı sayı sal bir şekilde elde etmek için
## her birini Metinsel'den Sayı sal değere dönüştürecek
## ifade aşağı daki gibidir.
1923.to_s.split('').map { |i| i.to_i }
#=> [1, 9, 2, 3]
## --
2024-05-19 09:27:05 +00:00
# Mantı ksal
2020-09-03 21:23:03 +00:00
## --
## Mantı ksal -> Metinsel
true.to_s #=> "true"
false.to_s #=> "false"
## Mantı ksal değeler için gerçeklenmiş başka bir dönüşüm
## metodu olmadı ğı için, bu kı smı dilde ufak bir nüansa ayı rmak
## istedim.
## Kaynak için ileri okumaya başvurunuz.
## Hangi programlama dilinden gelirseniz gelin,
## dilde doğruluk değerleri diye bir küme vardı r.
## Hangi değerlerin mantı ksal doğru değerine dönüşeceği,
## bu değer yerine geçebileceği
## fikri üzerine kurulu bir küme.
## Ve Ruby'de nil değeri, false dı şı nda, mantı ksal yanlı ş değerine çözümlenen tek şey.
## Bu ön bilgi ile doyduysak, başlayalı m.
!!nil #=> false
!!false #=> false
!!0 #=> true
!!"" #=> true
## Şimdi ne oldu burada ?
## `!!` ifadesi; değilinin değili, yani kendisi. Tek bir farkla.
## Verinin türü değiştiriliyor. Mantı ksal olarak yorumlanı yor.
## Yukarı da, nil ve false ifadeleri mantı ksal olarak yanlı ş olarak yorumlanı yor.
## Diğerleri ise mantı ksal doğru.
## --
2024-05-19 09:27:05 +00:00
# Metinsel
2020-09-03 21:23:03 +00:00
## --
## Metinsel -> Sayı sal
## Öncelikle dilde ufak bir tuzağa dikkat çekmek isterim.
"".to_i #=> 0
"asd".to_i #=> 0
## Sayı sal yorumlaması geçersiz ve boş her metinsel değer,
## 0 rakamı na değerlendirilir.
## Başarı lı bir dönüşüm,
"1234".to_i #=> 1234
## Sayı sistemini belirleyebileceğiniz seçimli bir argüman
## kabul ediyor, to_i metodu.
"1234".to_i 5 #=> 194
## 1234 sayı sı nı n, beşlik tabandaki karşı lı ğı .
## Tam sayı dı şı nda doğrudan dönüşümler
## dil olanağı olarak sunulmuş durumda;
## Kompleks sayı olarak,
"1234".to_c #=> (1234+0i)
## Ondalı k (Kayan-noktalı ) sayı olarak,
"1234".to_f #=> 1234.0
## Rasyonel sayı olarak,
"1234".to_r #=> (1234/1)
## Metinsel -> Mantı ksal
## Mantı ksal değerin kendisi için tersinin, tersini alı rı z
!!"seçkin" #=> true
## Mantı ksal tersi için ise tersini,
!"seçkin" #=> false
## Metinsel -> Sembol
"cengiz".to_sym #=> :cengiz
## Metinsel -> Dizi
"Cengiz Han".split #=> ["Cengiz", "Han"]
## split metodu, seçimli argümanı nı n varsayı lan değeri
## boşluk karakteridir.
## Metinsel -> Dizi | bölümlenerek
"Cengiz Han".split ""
#=> ["C", "e", "n", "g", "i", "z", " ", "H", "a", "n"]
## --
2024-05-19 09:27:05 +00:00
# Sembol
2020-09-03 21:23:03 +00:00
## --
## Sembol -> Metinsel
:metin.to_s #=> "metin"
## Başka bir dönüşüm için dilin bir teşviki yoktur.
## --
2024-05-19 09:27:05 +00:00
# Diziler
2020-09-03 21:23:03 +00:00
## --
## Dizi -> Metinsel
[1,2,3,4,5].to_s #=> "[1, 2, 3, 4, 5]"
## --
2024-05-19 09:27:05 +00:00
# Eşlemeler
2020-09-03 21:23:03 +00:00
## --
## Eşleme -> Dizi
{a: 1, b: 2, c: 3}.to_a
#=> [[:a, 1], [:b, 2], [:c, 3]]
## Her bir anahtar-değer çifti bir dizi olarak
## değerlendirilir ve elemanları sı rası yla
## anahtar ve değerdir.
## Eşleme -> Metinsel
{a: 1, b: 2, c: 3}.to_s
#=> "{:a=>1, :b=>2, :c=>3}"
## inspect metodu için bir takma addı r.
# --------------------------------
# Tanı mlamalar, ifadeler, yorumlama.
# --------------------------------
## --
## Yorumlama
## --
## Dökümanı n başı ndan beri gördüğümüz bu tek satı r yorumlama operatörü
## (#)
## kendinden sonra gelen her şeyin, satı r boyunca yorumlama olarak
## değerlendirilmesi gerektiğini Ruby yorumlayı cı sı na söyler.
## Ruby, farklı yorumlama imkanları da sağlamaktadı r.
## Örneğin;
=begin
Başlangı ç ifadesi (=begin), sonlandı rma ifadesi (=end)
ile arası nda kalan her şeyi yorum satı rı olarak ele alı r.
=end
## --
## Global değişkenler.
## --
## Ruby evrensel değişkenleri, kapsamı en geniş değişken türüdür.
## Her yerden erişilebilir...
## Basitçe dolar sembolü ( $ ) ile başlarlar.
$evrensel_bir_değişken = 42 #=> 42
## Bir çok metadoloji ve yöntem ve teknoloji, size
## evrensel değişkenler kullanmanı n projenizi karmaşı klaştı racağı
## ve bakı mı nı zorlaştı racağı nı söyler; Haklı dı rlar...
## --
## Varlı k değişkenleri.
## --
## At ( @ ) sembölü ile başlarlar ve isimlerinin de ifade ettiği
## gibi, kendileri bir Sı nı f'ı n değeridir.
class Varlı k
def initialize()
@varlı k_değişkeni = 101
end
2024-05-19 09:27:05 +00:00
2020-09-03 21:23:03 +00:00
def göster()
puts "Varlı k değişkeni: #@varlı k_değişkeni"
end
end
varlı k1 = Varlı k.new()
varlı k1.göster()
#=> Varlı k değişkeni: 101
## Sı nı f tanı mı şimdilik kafanı zı karı ştı rması n.
## İlgilenmemiz gereken kı sı m;
## @varlı k_değişkeni = 101
## ifadesidir. Ve nesne özelinde tanı mlama yapar.
## Kapsamı sadece o nesnedir.
## ! NOT: ilklenmemiş varlı k değişkenleri nil ön değeri ile
## yaşam döngüsüne başlar.
## --
## Sı nı f değişkenleri.
## --
## Sı nı f değişkenleri iki at ( @@ ) sembölü ile başlarlar.
## Tanı mlar, herhangi bir metot içinde
## kullanı lmadan önce ilklenmelidirler.
## İlklenmemiş bir Sı nı f Değişkenine referansta bulunmak,
## bir hata oluşturur.
class Sı nı f
@@sı nı f_nesne_sayı sı = 0
def initialize()
@@sı nı f_nesne_sayı sı += 1
end
2024-05-19 09:27:05 +00:00
2020-09-03 21:23:03 +00:00
def göster()
puts "Sı nı f sayı sı : #@@sı nı f_nesne_sayı sı "
end
end
sı nı f_varlı ğı 1 = Sı nı f.new()
sı nı f_varlı ğı 2 = Sı nı f.new()
sı nı f_varlı ğı 3 = Sı nı f.new()
sı nı f_varlı ğı 1.göster()
#=> Sı nı f sayı sı : 3
## --
## Yerel değişkenler.
## --
## Yerel değişkenlerin isimlendirmesi küçük harf
## ya da alt çizgi ( _ ) ile başlar ve kapsamı tanı mı n
## yapı ldı ğı sı nı f, modül, metot yada blok içinde kalı r.
## --
## Sabitler.
## --
## Ruby sabitleri, büyük harf ile tanı mlanı rlar ve
## kapsamları için iki senaryo mevcuttur;
## - Sı nı f ya da Modül içinde tanı mlanı rlarsa
## Tanı mı n yapı ldı ğı blok içinden erişilebilir.
## - Sı nı f ya da Modül dı şı nda yapı lan tanı mlar ise
## Evrensel bir kapsama sahiptir ve her yerden
## erişilebilirler.
## Örneğin:
class Sabit
SABİT = 299_792_458
def göster
puts "Sabit değer: #{SABİT}"
end
end
# Create Objects
sabit = Sabit.new()
sabit.göster()
#=> Sabit değer: 299792458
## İfadenin tanı mı ndaki alt çizgiler sizi yanı ltması n
## binlik ayracı olarak kullandı m ve Ruby yorumlayı cı sı
## tamamen görmezden geliyor.
## Bknz: Veriler ve Temsiller: Sayı lar.
## --
## Sözde Değişkenler.
## --
## Ruby özel bir dil.
## Öyle ki, Bazı sözde-değişkenler ile
## size, ihtiyacı nı z olabileceği erişimi sağlar.
## Ama onlara atama yapamazsı nı z.
## Sözde değişkenler ve kullanı mları
## ile ilgili İleri okumaya başvurunuz.
# --------------------------------
# Konvansiyonlar ve teşvikler.
# --------------------------------
## Konvansiyonlar:
## --
## İsimlendirme Konvansiyonları :
## Döküman boyunca yaptı ğı m gibi,
## tanı mlayı cı lar ve erişilebilir tanı mlanmı ş ifadeler
## için lütfen önerildiği gibi İngilizce kullanı n.
## İsimlendirme, Bilgisayar bilimlerinde yeterince
## ağı r bir zemin ve dilin teşvik ettiği rehber
## ve önerdiği konvansiyonları takip ederek
## bakı mı , okuması ve geliştirmesi kolay projeler
## gerçeklemek mümkündür.
## --
## Semboller, Metotlar ve Değişkenler için
##-Snake Case ( snake_case ) kullanı lması önerilir.
## --
## Sı nı flar için Camel Case (CamelCase):
## Sı nı f isimlendirmeleri için önerildiği gibi,
## Camel Case isimlendirme notasyonuna sadı k kalı n.
## --
## Dosyalar ve Klasörler için Snake Case (snake_case):
## Dosya ve klasörleri isimlendirmek için lütfen
## Snake Case isimlendirme konvansiyonuna sadı k kalı n.
## --
## Dosya Başı na Bir Sı nı f:
## Her dosyada bir sı nı f barı ndı rmaya özen gösterin.
## ---
## Bu kı sı mdaki teşvik içerikleri
## rubocop-hq/ruby-style-guide'dan gelmektedir.
## ! Rehbere göre bu dökümanı düzenle!
## --
## Girintileme:
## Girintileme için TAB yerine, iki boşluk kullanı n.
def bir_metot
birşeyler_yap
end
## Yerine;
def bir_metot
birşeyler_yap
end
## --
## Satı r Başı na Karakter:
## Satı r başı na maksimum 80 karakter olacak şekilde
## dökümanı yapı landı rı n.
## --
## Satı r Sonları :
## Unix-Stili satı r sonları nı kulanı n.
## Eğer Git kullanı yorsanı z;
## $ git config --global core.autocrlf true
## ifadesi sizi bu zahmetten kurtaracaktı r.
## --
## Satı r Başı na Bir İfade:
## Satı r başı na bir ifade kullanı n.
puts 'test!'; puts 'test!'
## Yerine;
puts 'test!'
puts 'test!'
## --
## Boşluklar ve Operatörler:
## Operatörler, virgüller, ifade ayraçları
## araları nda boşluk bı rakı n.
toplam=1+2
x,z=1,2
class FooError< StandardError ; end
## Yerine;
toplam = 1 + 2
x , z = 1 , 2
class FooError < StandardError ; end
## Bir kaç istisna hariç
## - Üs operatörü
## - Rasyonel sayı gösteriminde kullanı lan eğik çizgi.
## - Güvenli gösterim operatörü.
### Daha fazlası için ileri okumadaki
### bu rehbere danı şabilirsiniz...
# --------------------------------
# Bloklar, Kontrol blokları ve örnekler.
# --------------------------------
## --
## Ruby Blokları :
## Süslü parantezler ya da `do`, `end` ile çevrelenen,
## değişkenleri ortama bağlı işlevlerdir.
## Diğer dillerde !{Closure} ( closure ) karşı lı ğı
## bulur.
## Ruby'de bloklar, ifadeleri gruplamanı n bir şeklidir.
## Bloklar tanı mlandı kları nda çalı ştı rı lmazlar,
## Ruby, bu yönetimi akı llı ca yapar.
## Örneğin;
## Tanı mlamamı z
def selamla_sonra_çağı r
puts 'Selamlar!'
yield ## tüm sihir burada!
end
## Şimdi tanı mı çağı ralı m
selamla_sonra_çağı r {puts 'Çağrı , gerçekleşti!'}
#= Selamlar!
2024-05-19 09:27:05 +00:00
#= Çağrı , gerçekleşti!
2020-09-03 21:23:03 +00:00
#=> nil
## Çağı rı m, kendini çağı ran kaynağa nil döndürmekte.
## Değerlendirmenin sonucunda, Ruby yorumlayı cı sı ,
## ifadenin değerini nil olarak çı ktı lar.
## Fakat, puts çağrı ları , girdi/çı ktı işlevimizi
## yerine getirir ve metinleri ekrana basar.
## Blokları n argüman almaları da mümkündür:
def selamla_sonra_değer_ile_çağı r
puts 'Selamlar!'
yield('Hain Kostok') ## tüm sihir burada!
end
selamla_sonra_değer_ile_çağı r {|isim| puts "Sana da selam, #{isim}!"}
#= Selamlar!
#= Sana da selam, Hain Kostok!
#=> nil
## Detaylı bilgi için, ileri okumaya başvurunuz.
## --
## Eğer ( if ) kontrol ifadesi:
## Algoritmanı zda dallanma imkanı sağlar.
## Şablonu:
## if koşul_ifadesi [then]
## yürütülecek_kod
## [elsif bir_diğer_koşul [then]
## yürütülecek_diğer_kod]
## [else
## yürütülecek_bir_diğer_kod]
## end
## Bu kalı ba sadı k kalarak, dallanmaları mı zı kodları z.
## Köşeli parantezler, sezgisel olarak anlaşı lacağı üzere
## seçimli ifadelerdir.
## Örnek:
if true
puts 'Koşul ifadesi, buradan devam edecek!'
else
puts 'Buradan değil.'
end
#= Koşul ifadesi, buradan devam edecek!
#=> nil
## --
## Eğer ( if ) düzenleyicisi:
## Kompak bir dil olanağı dı r. Aynı şekilde, çalı ştı rı lacak kod
## ve bir koşul ifadesi alı r. Ve koşul ifadesine bakarak
## ifadenin yürütüleceğine karar verir.
## Şablonu:
## çalı ştı rı lacak_kod if koşul_ifadesi
## Örnek:
puts 'Bu ifade yürütülecek!' if true
#= Bu ifade yürütülecek!
#=> nil
## --
## Durum ( case ) kontrol ifadesi:
## Bir koşul ifadesi ve bir ya da daha fazla karşı laştı rma ifadesi
## alarak, eşleşen bloğu yürütür.
## Şablonu:
## case koşullanacak_ifade
## [when karşı laştı rma_ifadesi [, karşı laştı rma_ifadeleri ...] [then]
## yürütülecek_kod ]...
## [else
## eşleşme_olmazsa_yürütülecek_kod ]
## end
yaş = 27
case yaş
when 0 .. 2
puts "bebek"
when 3 .. 6
puts "küçük çocuk"
when 7 .. 12
puts "çocuk"
when 13 .. 18
puts "genç"
else
puts "yetişkin"
end
#= yetişkin
#=> nil
## --
## .. Sürece ( while ) kontrol ifadesi:
## Aldı ğı koşul ifadesini kontrol eder,
## kontrol bloğunu çağı rı r ve tekrar kontrol eder.
## Koşul ifadesi doğru olduğu sürece, kontrol bloğu
## çağı rı lmaya devam eder.
## Şablonu:
## while koşul_ifadesi [do]
## yürütülecek_kod
## end
## Örnek:
$n = 0
$sayı = 5
while $n < $sayı do
puts("Döngü içinde n = #$n" )
$n +=1
end
#= Döngü içinde n = 0
#= Döngü içinde n = 1
#= Döngü içinde n = 2
#= Döngü içinde n = 3
#= Döngü içinde n = 4
#=> nil
## --
## .. Sürece ( while ) düzenleyicisi:
## Eğer düzenleyecisi gibi, kompak bir dil olanağı dur.
## Kontrol ifadesinin işlevini yerine getirir,
## ama satı r içi kullanı ma müsade ederek.
## Şablonu:
## çalı ştı rı lacak_kod while koşul_ifadesi
## Yada:
## begin
## çalı ştı rı lacak_kod
## end while koşul_ifadesi
## --
## İçin ( for ) kontrol ifadesi:
## N kere, I kere, X kere gibi ifadelerin dildeki kontrol
## karşı lı ğı dı r. Çoklu veri üzerinde iterasyonlar yapmanı zı
## veri üzerinde operasyonlar yürütmenizi sağlar.
## Şablonu:
## for değişken [, başka_değişken ...] in ifade [do]
## yürütülecek_kod
## end
## Örnek:
for i in 1..5
puts i
end
#= 0
#= 1
#= 2
#= 3
#= 4
#= 5
#=> 0..5
## Ardı şı kları itere etmek için tek yol bu değil tabii.
## İlerleyen kı sı mda buna yer verilecektir.
## --
## Sonlandı rı cı ( break ) kontrol ifadesi:
2024-05-19 09:27:05 +00:00
## Bu kontrol ifadesi yürütüldüğünde, çalı şma zamanı nı
2020-09-03 21:23:03 +00:00
## en iç tekrarlı bloktan çı karı r.
## Örnek:
for i in 1..5
break if i > 2
puts i
end
#= 0
#= 1
#= 2
#=> nil
## break kontrol ifadesi, if düzenleyecisi ile çevrelenmiştir.
## if i > 2
## break
## end
## ifadesi ile eşdeğerdir.
## ifade yürütüldüğü anda, en yakı n tekrarlı blok terkedilir.
## Yorumlayı cı , sonraki ifadeden yürütmeye devam eder.
## Diğer kontrol ifadeleri ve kullanı mları için ileri okumaya başvurunuz...
# --------------------------------
# Özel anahtar kelimeler; kullanı mları ve örnekleri.
# --------------------------------
## --
2024-05-19 09:27:05 +00:00
## __ENCODING__:
2020-09-03 21:23:03 +00:00
## Bu anahtar kelime size yorumlayı cı kodlama türünü verecektir.
__ENCODING__
#=> "#<Encoding:UTF-8>"
## Platform, araç ve çalı şma zamanı yürütme
## yönteminize bağlı olarak alacağı nı z çı ktı
## değişiklik gösterebilir.
## --
## __LINE__:
## Geçerli dosyada, yürütme satı r numarası nı verir.
__LINE__
#=> 67
## Platform, araç ve çalı şma zamanı yürütme
## yönteminize bağlı olarak alacağı nı z çı ktı
## değişiklik gösterebilir.
## --
## BEGIN ve END:
## BEGIN:
## Dosyadaki tüm içerikten önce yürütülür.
## END:
## Dosyadaki tüm içeriklerden sonra yürütülür.
## --
## alias:
## Herhangi bir tanı mlayı cı için takma ad tanı mlamanı za
## olanak sağlar.
$eski = 0
alias $yeni $eski
$yeni
#=> 0
## --
## and:
## Düşük öncelikli bir Mantı ksal VE operatörü.
## --
## begin / end ve rescue:
## İstisnalar begin / end blokları
## arası nda ele alı nı r ve `rescue` anahtar kelimesi ile
## işlenirler.
## İstisnalar ve mantalitesine dair ön girişi
## Teşvik edilen paradigma ve anlatı mı kı smı nda bulabilirsiniz.
## Hata yönetimi, Ruby'de de özenle işlenmiş bir konudur.
## Örnek:
begin
yanlı ş_bir_hesaplama = 2/0
puts "Hesaplama sonucu: #{yanlı ş_bir_hesaplama}"
rescue ZeroDivisionError => hata_nesnesi
puts "Sı fı ra bölümle ilgili bir hata yakalandı : #{hata_nesnesi.message}"
end
#= Sı fı ra bölümle ilgili bir hata yakalandı : divided by 0
#=> nil
## Örneğimizde matematiksel sistemimiz için hatalı bir
## işlem gerçekleştiriyoruz. Sonrası nda hatayı ilgili
## hata durumu için belirlediğimi alanda yönetiyoruz.
## Örnekte hatayı çı ktı layarak yönettik, gerçek dünyada
## biraz daha kompleks gerçekleşebilir.
## Gerçek dünya örnekleri için ileri okumaya başvurabilirsiniz.
## --
## defined?:
## defined?, argümanı nı metinsel olarak açı klayan bir dil olanağı dı r.
## Örnek:
RUBY_VERSION
#=> "2.4.0"
defined? RUBY_VERSION
#=> "constant"
defined? nil
#=> "nil"
defined? puts
#=> "method"
## --
## ensure:
## Hata yönetiminin bir parçası olarak dilde görev atfedilen ensure,
## blok içinde, hata olsun ya da olması n yürütüleceği garanti edilen
## dil ifadeleri için bir imkandı r.
## Örnek:
begin
yanlı ş_bir_hesaplama = 2/0
puts "Hesaplama sonucu: #{yanlı ş_bir_hesaplama}"
rescue ZeroDivisionError => hata_nesnesi
puts "Sı fı ra bölümle ilgili bir hata yakalandı : #{hata_nesnesi.message}"
ensure
puts "Hesaplama bloğu sonlandı !"
end
#= Sı fı ra bölümle ilgili bir hata yakalandı : divided by 0
#= Hesaplama bloğu sonlandı !
#=> nil
## --
## self:
## Nesnenin kendisine erişim sağlayan bir dil olanağı .
## Örnek:
dünya = "Dünya!"
#=> "Dünya!"
dünya
#=> "Dünya!"
dünya.class
#=> String
def dünya.selamla
"Merhaba, " + self
end
#=> :selamla
dünya.selamla
#=> "Merhaba, Dünya!"
## Nesnenin kendisine bir metot tanı mladı k,
## bunu yaparken de değerine erişim sağladı k.
## --
## super:
## Nesne yönelimli programlama (spesifik olarak, obje tabanlı )
## paradigması na göre, kalı tı m konseptinde, türeyen sı nı fı n
## türetildiği sı nı fa erişimi (üst sı nı fı , atası , hiyerarşik üstü)
## bu anahtar kelime ile gerçekleşir.
class A
def initialize(a)
@a = a
end
end
class B < A
def initialize(a, b)
@b = b
super a
end
end
b = B.new 1, 2
#=> #<B:0x00007f852d04c7e8 @b=2, @a=1>
## super ile üst sı nı fı n ilklenmesi gerçekleştirildi,
## aldı ğı mı z çı ktı da da @a=1 çı ktı sı yla gözlemlenebilir.
## Bu konunun, dilin paradigma teşviği ile ilgili
## olduğunu ve anlamazsanı z, Paradigma başlı ğı nı bitirdikten
## sonra tekrar bu örneği değerlendirmeniz gerektiğini hatı rlatı rı m.
## --
## yield:
## Ruby blokları kı smı nda anlattı k, ama, burada da bir nüanstan
## bahsetmeden geçemeyeceğim.
## Çalı ştı rı labilir ifadeleri çalı ştı rmanı n birden fazla yolu vardı r.
## Fakat yield, en performanslı dil olanağı olarak dökümanda işlenmiş.
## Kaynak için ileri okumaya danı şı n.
# --------------------------------
# G/Ç ( I/O )
# --------------------------------
=begin
G/Ç, Girdi/Çı ktı ( Input/Output ) kı saltması dı r.
Temelde, sistemden girdi almak ve çı ktı yaratmak amacı yla vardı r.
Girdi örnekleri:
- Klavyeden bastı ğı nı z herhangi bir tuş.
- Fare hareketleriniz ya da tı klamaları nı z.
- Mikrofonunuzun aldı ğı sesler.
2024-05-19 09:27:05 +00:00
2020-09-03 21:23:03 +00:00
Çı ktı örnekleri:
- Herhangi bir dil ifadesinin sonucu.
- Dijital bir ses dosyası nı n sese dönüşmesi.
- Ekranda gördükleriniz.
2024-05-19 09:27:05 +00:00
Fakat endişelenmeyin, G/Ç derken, şu anda
2020-09-03 21:23:03 +00:00
biz sadece Ruby'de,
- Dosya okuma/yazma.
- Ekrana metin yazdı rma / Bilgi okuma.
- Ağ soketleri. ( biraz da olsa )
işlerinden bahsediyor olacağı z.
=end
defined? IO
#=> "constant"
IO.class
#=> Class
## IO sı nı fı , File ve Socket gibi pratik kullanı mı olan sı nı fları n atası dı r.
## Septikler için;
File.superclass
#=> IO
## Gözlemlediğiniz üzere, superclass metodu, üst sı nı fı veriyor.
## --
## Dosya Okuma ve Yazma:
## Ruby'de dosya okuma ve yazma işlemleri için, File
## sı nı fı nı kullanacağı z.
## Dosyaya yazmak için;
File.write 'test.txt', "a,b,c"
#=> 5
## 5, ifadenin ürettiği dönüş değeridir.
## ve, çı ktı lanan karakter sayı sı nı verir.
## Dosyadan okuma için;
## Bu kı sı m, açı klayı cı olması açı sı ndan
## ifadeleri teker teker işleyeceğiz.
File
#=> File
## Sı nı fı mı z.
File.readlines 'test.txt'
#=> ["a,b,c"]
## readlines File sı nı fı nı n bir metodu ve aldı ğı argüman dosya yoludur.
File.readlines('test.txt').first
#=> "a,b,c"
## Dönüş değeri bir diziydi, her bir satı r bir eleman olacak şekilde.
## Biz, kendi verilerimizi, kendi ayı racı mı zla kaydetmeyi seçtik.
## Eğer, `\n` satı r ifadesi ile ayı rmayı seçseydik, readlines
## metodu zaten işlevi gereği, bize değerleri ayrı ayrı verecekti.
File.readlines('test.txt').first.split ','
#=> ["a", "b", "c"]
## verilerimizi aldı k.
## Eğer yeni satı r karakterini ayı raç olarak kullansaydı k;
File.write 'ntest.txt', ['a', 'b', 'c'].join("\n")
#=> 5
File.readlines('ntest.txt').map(& :chomp)
#=> ["a", "b", "c"]
## Bu da genel kullanı mlı bir yaklaşı mdı r.
## --
## Ekrana bilgi yazdı rma ve Okuma:
## Konsol'a bilgi çı ktı lamak için,
## önceden tanı mlanmı ş $stdout global nesnesini kullanacağı z.
## Pratik kullanı mda, prints işlevinden bir farkı yoktur.
## Aynı sonuca ikisi ile de ulaşabilirsiniz.
$stdout.print "Bu bir çı ktı .\n"
#= Bu bir çı ktı .
#=> nil
## Şimdi kullanı cı dan bilgi okuyalı m:
$stdin.gets
#! Bu kı sı mda hiç bir çı ktı verilmez ve aksine
#! sizden girdi beklenir. Bir metin yazı n ve onaylamak için
#! enter tuşunu kullanı n.
#- Bu bir girdi metni!
#=> "Bu bir girdi metni!\n"
## Aldı ğı mı z veriyi temizlenin yolunu biliyoruz.
## Dönüş değerine chomp metodunu uygulamak.
$stdin.gets.chomp
#- Bu bir girdi metni!
#=> "Bu bir girdi metni!"
## --
## Ağ girdi/çı ktı yönetimi
## Ruby'de soketler (Socket)
## haricen çalı şma zamanı na dahil edilir.
require 'socket'
#=> true
soket = TCPSocket.new('google.com', 80)
#=> #<TCPSocket:fd 13, AF_INET, 192.168.0.11, 63989>
## Alacağı nı z çı ktı değişiklik gösterebilir.
## Soketi oluşturduk ve bir değişkene atadı k.
## Şimdi bunun üzerinden okuma ve yazma işlemlerini
## gerçekleştireceğiz.
soket.write "GET / HTTP/1.1"
#=> 14
soket.write "\r\n\r\n"
#=> 4
## İki write metodunun sonucu da, sokete yazı lan verinin
## uzunluğudur.
## Şimdi okuma zamanı , soketi açtı k, isteğimizi bildirdik.
## Şimdi soket üzerinden aldı ğı mı z cevabı ekrana yazdı ralı m.
soket.recv 80
#=> "HTTP/1.1 200 OK\r\nDate: Thu, 03 Sep 2020 10:48:21 GMT\r\nExpires: -1\r\nCache-Control"
## Alacağı nı z çı ktı değişiklik gösterebilir.
## Ancak, başarı lı şekilde okuma yaptı k.
# --------------------------------
# Teşviğinde bulunduğu paradigma ve derinlemesine anlatı mı .
# --------------------------------
## --
## Nesne Yönelimli Programlama Nedir?
## Kı saca NYP, en basit anlatı mı yla;
## nesnelerle programlamadı r.
## Nesne paradigması , her programcı ya doğal ve sezgisel gelir.
## Bunun sebebi, zaten gerçekliği algı lama şeklimize uygun olması dı r.
## Araba, onu bir araya getiren nesnelerden oluşur,
## tekerlekleri, direksiyonu, kasası , ve diğer parçaları yla.
## Ama bu, tam tanı m değildir. NYP'de, Nesneler,
## Bilgilere ( evet, varlı k olarak başka nesneler de sayı labilir )
2024-05-19 09:27:05 +00:00
## ve bu bilgileri yönetecek ( hesaplamalar gerçekleştirecek
2020-09-03 21:23:03 +00:00
## ya da aksiyonlar alacak -- G/Ç -- gibi ) metotlara sahiptir.
## Bir nesnenin en net tanı mı böyle yapı labilirken,
## NYP, bir gerçek dünya problemi için bir araya getirilmiş
## -- çoğunlukla birden fazla -- sı nı fları n yapı ları ,
## ilişkileri ve işlevlerini ele alı r.
## Bir paradigma olarak NYP, bizlere her varlı ğı nesne olarak
## modellemeyi ve problem uzayı mı zdaki nesnelerle olan ilişkilerini
## Ruby'de NYP için sağlanan imkanlarla yönetmeyi öğütler.
## Sı nı f içerisinde saklanan bilgiye öznitelik ya da özellik,
## işlevlere ise metot denilir.
## NYP jargonu için ileri okumaya başvurabilirsiniz.
## --
## Ruby'de NYP teşviki:
## Nesneler, Sı nı fları n gerçeklenmiş halleridir.
## Tam tersi ile, Sı nı flar ise, nesnelerin soyut kalı pları dı r.
## Bir sı nı f tanı mı yapalı m ve gerçekleyelim:
class Araba
end
#=> nil
## Evet, evet. Tanı mı mı z hiç bir öznitelik ( attributes ) ya da
## metot ( method ) içermiyor.
## Şimdi bir özellik ekleyelim
class Araba
def initialize(hı z)
@hı z = hı z
end
end
araba = Araba.new 100
#=> #<Araba:0x00007f7f300e59c8 @hı z=100>
## En naif haliyle, hı z bilgisi saklayan bir araba sı nı fı gerçekledik.
## initialize metodu, Ruby imkanları ile, nesne yaşam döngünüzün ilk adı mı dı r.
## Bu döngüyü aşağı daki gibi betimlemek mümkündür.
## İlkleme ( initialize ) -> [İşlevlerin çağı rı mı ] -> Sonlandı rma
## İlkleme, initialize metodu ile ele alı nı r, alı nacak tüm argümanlar,
## sı nı fı n iş mantı ğı doğrultusuyla, bu ilk işlevde yönetilir ve nesne
## kullanı ma hazı r hale getirilir.
## Şimdi bir işlev ekleyelim.
class Araba
def initialize(hı z)
@hı z = hı z
end
2024-05-19 09:27:05 +00:00
2020-09-03 21:23:03 +00:00
def git!
puts 'Hı nn, hı nn!'
end
end
araba = Araba.new 100
#=> #<Araba:0x00007f7f300e59c8 @hı z=100>
## Şimdi metodu çağı rı yoruz.
araba.git!
#= Hı nn, hı nn!
#=> nil
## Başlı ğı n amacı sadece Ruby'nin NYP olanakları nı ve
## teşviğini işlemek değil. Paradigmaya bir giriş kazandı rmak.
## Bundan dolayı , etkileşim içinde birden fazla sı nı f görmeliyiz.
class Tekerlek
YERLİ = 5
İTHAL = 1
def initialize (tür)
@güç = tür
end
def döndür!
@güç -= 1
end
end
class Araba
def initialize (hı z)
@hı z = hı z
@tekerlekler = (1..4).map {|| Tekerlek.new(Tekerlek::YERLİ)}
end
def git!
if @tekerlekler .map(& :döndür!).filter {|ömür| ömür < 0 }. first then
puts 'Paat!'
else
puts 'Hı nnn, hı nnn!'
end
end
end
## nesnemizi oluşturuyoruz
araba = Araba.new 100
## altı sefer, araba nesnesinin git! metodunu çağı rı yoruz.
(0..6).map {|| araba.git! }
#= Hı nnn, hı nnn!
#= Hı nnn, hı nnn!
#= Hı nnn, hı nnn!
#= Hı nnn, hı nnn!
#= Hı nnn, hı nnn!
#= Paat!
#= Paat!
## İş mantı ğı mı za göre, arabamı zı n dört tekeri ve ve Yerli olanlar
## 5 birim dayanı klı lı ğa sahip. ;)
## Bu beş birim tükenince, araba gitmek yerine,
## patlak teker çı ktı sı alı yoruz.
## Şimdiye kadar gördüklerimizi bir analiz edelim;
## Araba, sı nı fı n ismi. Her sı nı f, tanı mlamasak da, temel bir
## kurucu metot içerecek şekilde dil işleyicisi tarafı ndan
## ele alı nı yor.
## Bizim bir tanı mı mı z var ama.
## Hı z bilgisi alı yoruz.
## bu bilgi, sı nı f özniteliğidir. Sı nı f, bu bilgiye kendi içinden erişebilir.
## Bir de, binek araçları n dört tekerleği olduğu fikriyle,
## nesne içinde, kurucu metot içinde dört tane Tekerlek nesnesi gerçekliyor
## ve saklı yoruz.
## İş mantı ğı mı za göre onlara erişmemiz gerekiyor.
## git! metodu içinde, erişiyor ve kullanı yoruz.
## metotları n sonundaki ünlem işareti bir konvansiyondur,
## metotları n saf olmayan çağı rı mlar gerçeklediği anlamı na gelmektedir.
## Kendilerini ( ya da sahip olduğu diğer nesneleri ) değiştirdikleri,
## bir girdi/çı ktı gerçekleştirdikleri yada buna benzer yan etki içeren
## bir ifade barı ndı rdı kları anlamı na gelir.
## Sizi temin ederim ki, NYP, bu dökümanı ( hali hazı rda ~1560 satı r )
## genel anlatı mı için bile ikiye katlayabilir.
## Lütfen detaylı bilgi için ileri okumaya başvurunuz.
```
2024-05-19 09:27:05 +00:00
## İleri okumalar.
2020-09-03 21:23:03 +00:00
Tümüyle İngilizce olan bu ileri okumalara inat, bu detaylı özgün Türkçe içeriği üretmek istedim.
Dilerim, benden sonra katkı da bulunanlar olur.
- [Ruby Style Guide ](https://rubystyle.guide ), Ruby stil rehberi.
- [Ruby-Doc üzerinde Proc ](https://ruby-doc.org/core-2.4.0/Proc.html ), Ruby Blokları ve Proc kavramı için.
- [Ruby-Doc üzerinde String ](https://ruby-doc.org/core-2.6/String.html ) sı nı fı , işlevleri, metotları .
- [Ruby-Doc üzerinde TrueClass ](https://ruby-doc.org/core-2.5.1/TrueClass.html#method-i-to_s ) Dildeki mantı ksal ifadelerin gerçeklemesi olan TrueClass (ve FalseClass için de aynı bağlantı üzerinden içeriğe ulaşı labilir) dönüşüm içeriği kaynağı .
- [Ruby Gerçeklemeleri Listesi ](https://github.com/codicoscepticos/ruby-implementations ) Ruby'nin farklı platformlardaki gerçeklemeleri. Opal ve Topaz dikkat çekenleridir.
- [The Object-Oriented Thought Process ](https://www.amazon.com/Object-Oriented-Thought-Process-Developers-Library/dp/0321861272 ) kitap, bir paradigma olarak NYP ve düşünce yapı sı ndan bahsediyor. Bir paradigma olarak, NYP, türetildiği temel paradigmadan ne almı ş, başka paradigmalara ne kadar imkan sağlı yor ve paralel paradigma uyumu konusunda tüm soruları nı za cevap bulabilirsiniz. Yazar, belli etmese de, pragmatik bir yaklaşı mda.
- [Block Argument ](https://docs.ruby-lang.org/en/2.4.0/syntax/methods_rdoc.html#label-Block+Argument ) Ruby Blokları ve yield hakkı ndaki Ruby resmi döküman sayfası ve alt başlı ğı .