SORU
20 AĞUSTOS 2010, Cuma


Neden Ruby hem özel hem de koruma yöntemleri var mı?

this article, okumadan önce access kontrol bu gibi Ruby çalıştı düşündüm:

  • public - herhangi bir nesne (*3 örneğin*) tarafından erişilebilir
  • protected - sadece nesnenin kendisi olarak, alt sınıfların içinden erişilebilir
  • private - aynı korunmalı, ama bu yöntem sınıfları yok

Ancak, öyle görünüyor ki protected private hareket aynı, dışında aslında bunu yapamazsın çağrı private yöntemleri ile açık bir alıcı (yani self.protected_method çalışır, ama self.private_method gelmez).

Bu ne anlamı var? Ne zaman senin yöntemi denilen açık bir alıcı ile istemediğin bir senaryo var mı?

CEVAP
20 AĞUSTOS 2010, Cuma


11* *yöntemleri tanımlama sınıf veya alt sınıflar her örneği tarafından çağrılabilir.

private yöntemler sadece arama nesnenin içinden çağrılabilir. Başka bir örneği özel yöntemler doğrudan erişim yapamazsınız.

Burada hızlı pratik bir örnek:

def compare_to(x)
 self.some_method <=> x.some_method
end

some_method private burada olamaz. Bu açık alıcıları destek olduğu için ** 16 yaşında olmalı. Tipik iç yardımcınız yöntemler genelde hiç böyle denmesini ihtiyacı olduğundan private olabilir.

Önemli bu şekilde Java veya C eserlerden farklı olduğunu unutmayın. Ruby private alt sınıfların yöntemi erişimi olan Java/C protected benzer. Ruby'de private gibi kendi sınıflarından bir yöntem erişimi sınırlamak için yolu Java yok.

Yakut görünürlüğünü büyük ölçüde bir "tavsiye" her zaman bir yöntemi kullanarak erişebilir beri neyse send:

irb(main):001:0> class A
irb(main):002:1>   private
irb(main):003:1>   def not_so_private_method
irb(main):004:2>     puts "Hello World"
irb(main):005:2>   end
irb(main):006:1> end
=> nil

irb(main):007:0> foo = A.new
=> #<A:0x31688f>

irb(main):009:0> foo.send :not_so_private_method
Hello World
=> nil

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • PhoneArena

    PhoneArena

    7 NİSAN 2006
  • skiesofblack.net

    skiesofblack

    14 HAZİRAN 2009
  • superflyy88

    superflyy88

    8 ŞUBAT 2009