27 Haziran 2014 Cuma

Ruby Dilinin Temel Özellikleri

DEĞİŞKENLER
    1. İSİMLENDİRME



Alfanümerik karakterler (A-Z, a-z, 0-9) ve alt tire ( _ ) gibi karakterler isimlendirmede kullanılabilir. Ancak değişken ve metod isimleri sayı ile başlamaz. EK olarak metod isimleri soru işareti (?) veya ünlem (!) İle bitebilir [4].


Ruby dilinde değişken ve metodların isimlerin uzunluğu konusunda bir sınırlama yoktur. Örneğin aşağıdaki kod 10000 karakter uzunluğunda bir metod tanımlamak için kullanılabilir [2]:


looong_name = "a" * 10000; # => "aaaaaaaaa.....
a_class = Class.new
a_class.__send__(:define_method, looong_name) { :hello }
a_class.new.__send__(looong_name) # => :hello

puts a_class.instance_methods.inspect # you better not run this :-)


Değişkenler ön tanımlı $!, $stderr, $FILENAME, $0, $1, $ERROR_INFO gibi anahtar kelimeler ve __FILE__, self, nill gibi ön tanımlı sabitlerle aynı isimlere sahip olamazlar.


self = 5
=> #<RuntimeError: no>


    1. TİP TANIMLARI



Değişken tipleri javascript, PHP gibi dillerde olduğu gibi dinamik olarak belirlenir [5]


a = 5
=> 5
a = “5”
=> “5”
a
=> “5”
Değişkenler numerik, string, dizi, hash gibi tipler alabilir [5]. Ruby dinamik tanımlı (dynamically typed) bir dil olduğundan, tip kontrolü, değişken çalıştırıldığında yapılır [6].


    1. KAPSAM



Ruby'de sabit kapsam (static scope) kullanılmaktadır, yani değişkenler yerel kapsamdan başlayıp, daha geniş kapsamlara adım adım giderek aranır [7]
    1. DEĞİŞKEN ÇEŞİTLERİ

Ruby dilinde genel, yerel ve örnek olmak üzere 3 farklı çeşit değişken vardır. Bir çok programlama dilinde değişkenlerin çeşitleri açıkca belirtilir. Ancak, Ruby değişken isminin ilk karakterinden, değişkenin çeşidinin çözümlenmesi yoluna gitmiştir  [1].


İLK KARAKTER
DEĞİŞKEN ÇEŞİDİ
DEĞİŞKEN KAPSAMI
$
Genel Değişken
Tüm program
@
Örnek Değişken
Nesne
[a-z] veya _
Yerel Değişken
Bildirildiği yer
@@
Sınıf Değişkeni
Ana sınıf ve alt sınıflar
[A-Z]
Sabit
Hem sınıf, hem sınıf dışı


İstisnai olarak,  daima o an çalışmakta olan nesneyi ifade eden self ve ilklendirilmemiş değişkenlere atanan anlamsız değer olan nil isimlendirme kuralına göre yerel değişkenler gibi tanımlanmış olsalar da, aslında self genel bir değişken, nil ise bir sabittir.


      1. GENEL (Global) DEĞİŞKEN

$  ile başlayan bir ada sahiptir. Kapsam olarak, genel değişkenlere yazılımın her hangi bir yerinden başvurulabilir. İlklendirilmeden önce nil değerine sahiptirler [1].


Genel değişkenler izlenilebilirdir. Bir genel değişkenin değeri değiştiğinde çağrılan bir yordam tanımlanabilir. Bu tip kullanımda, genel değişken etkin değişken olarak da isimlendirilir [1].


      1. ÖRNEK (Instance) DEĞİŞKEN

@ ile başlayan bir ada sahiptir. Etki alanı self nesnesi ile sınırlıdır. Nesne dışından değiştirilemez. Nesnedeki ilk kullanımında kendiliğinden oluşur [1].


class OrnekDeneme
 def set_foo(n)
   @foo = n
 end
 def set_bar(n)
   @bar = n
 end
end


      1. YEREL DEĞİŞKEN

Küçük harfle ya da “_” karakteriyle başlar. Yerel değişkenler genel ya da örnek değişkenlerde olduğu gibi, başlangıçta nil değerine sahip değildirler, çünkü atama yapmadan gerçekte oluşmazlar. Yerel bir değişkene yaptığınız ilk atama onu bildirmekle aynı şeydir. Eğer başlangıç değeri olmayan bir yerel değişkene başvurursanız, Ruby yorumlayıcısı bunun bir yöntemi çalıştırma girişimi olduğunu düşünür ve hata verir [1].


Genelde yerel bir değişkenin etki alanı sırasıyla aşağıdakilerden biridir [1]:
  • proc{ ... }
  • loop{ ... }
  • def ... end
  • class ... end
  • module ... end
  • yazılımın tamamı (yukarıdakilerden herhangi biri yoksa)


Örneğin, aşağıdaki kodda “bar” isimli yerel değişken loop dışından erişilmeye çalışıldığında nil değerini verir. Çünkü loop içindeki ve dışındaki değişkenler ayrı kapsamdadır ve ayrı değişkenler olarak değerlendirilirler.


loop{
 bar=45;
 break
};
bar;


      1. SINIF DEĞİŞKENLERİ

@@ ile başlar ve sınıfın tüm örnekleri tarafından paylaşılırlar. Bir sınıfı miras alan alt sınıflar tarafından da erişilebilirler [3].
Aşağıdaki örnekte @@foo değişkeninin değerini son erişen Thing2 sınıfı  değiştirmiştir.


class Parent
 @@foo = "Parent"
end

class Thing1 < Parent
 @@foo = "Thing1"
end
class Thing2 < Parent
 @@foo = "Thing2"
end


      1. SINIF SABİTLERİ

Büyük harfle başlarlar. Sabitlere bir kere değer ataması yapılmalıdır. Eğer yeniden değer ataması yapılırsa, hata değil uyarı mesajı verilir. Sabitler sınıfla beraber tanımlanmalıdır ancak, örnek değişkenlerin aksine sınıf ismiyle beraber belirtilerek (Ör. sinif::SABIT şeklinde) sınıfın dışından da erişilebilirler [1].


class Foo
 BAR = 123
end
puts Foo::BAR   
# => 123



[1]
M. Slagell and P. Yanardağ, "Ruby Kullanıcı Kılavuzu," 22 Nisan 2003. [Çevrimiçi]. Available: http://pdf.belgeler.org/uygulamalar/ruby/ruby-ug.pdf. [Erişim Tarihi: 8 Nisan 2014].

[2] Daniel Vartanov, “What's the maximum length of a method name in ruby?”, 29 Ekim 2011, http://stackoverflow.com/questions/7935867/whats-the-maximum-length-of-a-method-name-in-ruby. [Erişim Tarihi: 8 Nisan 2014].
[3] “Ruby Programming/Syntax/Variables and Constants”, Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants. [Erişim Tarihi: 8 Nisan 2014].
[4] “Ruby Programming/Syntax/Lexicology”,Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Lexicology . [Erişim Tarihi: 8 Nisan 2014].
[5] “Ruby Programming/Syntax/Literals”,Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Literals . [Erişim Tarihi: 8 Nisan 2014].
[6] Tim Hoolihan, “Static vs. Synamic Scope”, 17 Şubat 2009, http://hoolihan.net/blog-tim/2009/02/17/static-vs-dynamic-scope/ . [Erişim Tarihi: 10 Nisan 2014].
[7] “What kind of scoping does Ruby use?Static or Dynamic”,Forum Ruby, https://www.ruby-forum.com/topic/91666 . [Erişim Tarihi: 10 Nisan 2014].

NOT: YTÜ - İleri Programlama Dili Dersi 2014 1. Dönem Ödevi Çerçevesinde Hazırlanmıştır.

NOT 2: Ruby 1.9 baz alınmıştır.

Hiç yorum yok: