Erişgeçler

Geçtiğimiz bölümlerde örnek değişkenlerden kısaca bahsettik ancak henüz işimiz bitmedi. Bir nesnenin örnek değişkenleri onun kendisine ait olan ve aynı sınıfa ait diğer nesnelerden ayıran öznitelikleridir.

Bu öznitelikleri okuyabilmek ve yazabilmek önemlidir; bu yüzden öznitelik erişgeçleri denilen yöntemi kullanırız. Bir kaç dakika sonra erişgeç yöntemlerini her zaman açıkça yazmak zorunda olmadığımızı göreceksiniz ancak şimdilik tüm devinimlere bakalım. Erişgeçler iki çeşittir: yazıcılar ve okuyucular.

ruby>   class Meyve
    |    def cesit_ata(k)  # bir yazıcı
    |      @kind = k
    |    end
    |    def ne_cesit     # bir okuyucu
    |      @kind
    |    end
    |  end
   nil
ruby>   f1 = Meyve.new
   #<Meyve:0xfd7e7c8c>
ruby>   f1.cesit_ata("seftali")  # yazıcıyı kullan
   "seftali"
ruby>   f1.ne_cesit           # okuyucuyu kullan
   "seftali"
ruby>   f1                    # nesneyi yokla
   #<Meyve:0xfd7e7c8c @kind="seftali">

Yeterince basit; baktığımız meyve hakkında istediğimiz bilgiyi yerleştirebilir ya da erişebiliriz. Ama yöntem isimlerimiz biraz uzun. Aşağıdaki daha kısa ve daha uzlaşımsal:

ruby>   class Meyve
    |    def cesidi=(k)
    |      @cesidi = k
    |    end
    |    def cesidi
    |      @cesidi
    |    end
    |  end
   nil
ruby>   meyve = Meyve.new
   #<Meyve:0xfd7e7c8c>
ruby>   meyve.cesidi = "muz"
   "muz"
ruby>   meyve.cesidi
   "muz"

inspect yöntemi

Küçük bir uzlaşma sağlanmıştır. Bir nesneye doğrudan ulaşmak istediğimizde #<birNesne:0x83678> gibi şifreye benzer birşeyle karşılaştığımıza dikkat edin. Bu öntanımlı bir davranıştır ve istediğiniz gibi değiştirebilirsiniz. Yapmanız gerek tek şey inspect yöntemini eklemektir. inspect yöntemi, nesneyi birkaç ya da bütün örnek değişkenleri de içeren ve mantıklı bir şekilde tanıtan bir yöntemdir.

ruby>   class Meyve
    |    def inspect
    |      @kind + "bir meyve çeşididir"
    |    end
    |  end
   nil
ruby>  meyve
   "muz bir meyve çeşididir"

Benzer bir yöntem de ekrana bir nesne yazdıracağımız zaman kullandığımız to_s (dizgeye dönüştürür) yöntemidir. Genel olarak inspect yöntemini yazılım geliştirirken ve hata ayıklarken kullandığınız bir araç olarak, to_s'yi de yazılımın çıktısını düzeltmek için kullandığımız bir yol düşünebilirsiniz.

eval.rb sonuçları görüntülemek için her zaman inspect yöntemini kullanır.

p yöntemini, yazılımlarınızdan hata ayıklama çıktısı almak için kullanabilirsiniz.

# Bu iki satır eşdeğerdir:
p birNesne
print birNesne.inspect, "\n"

Erişgeçleri kolay hale getirmek

Her örneğin bir erişim yöntemine ihtiyacı olmasına rağmen, Ruby standart tarzlar için daha elverişli bir yol sunar.

Tablo 4.4.

Kısayol Etkisi
attr_reader :v def v; @v; end
attr_writer :v def v=(value); @v=value; end
attr_accessor :v attr_reader :v; attr_writer :v
attr_accessor :v, :w attr_accessor :v; attr_accessor :w

Şimdi bunun avantajlarından faydalanalım ve bilgimizi tazeleyelim. Öncelikle otomatik olarak oluşturulmuş bir okuyucu ve yazıcı olup olmadığına bakarız ve yeni bilgiyi inspect'in içine dahil ederiz:

ruby>   class Meyve
    |    attr_accessor :nitelik
    |    def inspect
    |      "#{@nitelik} bir #{@cesit}"
    |    end
    |  end
   nil
ruby>   meyve.nitelik = "olgun"
   "olgun"
ruby>   meyve
   "olgun bir muz"

Meyveyle biraz daha eğlence

Eğer kimse olgunlaşmış meyvemizi yemezse, parasını almak için beklemeliyiz.

ruby>   class Meyve
    |    def durumu
    |      @nitelik = "çürük"
    |    end
    |  end
   nil
ruby>   meyve
   "olgun bir muz"
ruby>   meyve.durumu
   "curuk"
ruby>   meyve
   "çürük bir muz"

Ancak buralarda oynarken, küçük bir sorunla karşılaştık. Üçüncü bir meyve yaratmaya çalıştığımızda ne olur? Örnek değişkenlerin onlara değer atanmadan var olmadıklarını hatırlayın.

ruby>   f3 = Meyve.new
ERR: failed to convert nil into String

Burada yakınılan inspect yöntemidir ve geçerli bir sebebimiz var. f3'e özellik atamadan bir meyvenin çeşidi ve niteliği hakkında bir rapor istedik. Eğer istersek, inspect yönteminin defined? yöntemini de kullanarak sadece tanımlanmış meyveleri rapor etmesini sağlayabiliriz ancak bu iş hala kullanışsız olur, çünkü her meyvenin bir çeşidi ve niteliği olduğuna göre bu ikisinin her zaman tanımlı olduğundan emin olmamız gerekir. Bu ileriki bölümün konusudur.