2012-03-28 26 views
5

Başka bir soruya cevap verirken, aşağıdaki programın yaptığım şeyi tam olarak yapmadığını fark ettim. Ben her zaman üst düzey yöntemi çağrıları main nesne örneği tarafından çözülmesi yönündeki düşündüğümüz gibiRuby global kapsamı

puts "test" 
self.puts "test" # => private method `puts' called for main:Object (NoMethodError) 

istisna, beni şaşırtıyor, ancak bu durum görünmüyor.

İlk aramanın gerçek alıcısı nedir ve nasıl çözümlenir? Bu, yalnızca üst düzey kapsamdaki yöntem çağrıları için geçerli olan özel bir kural mı?

cevap

4

İşte bu soru hakkında görüş bildiren bir good discussion.

Kernel tarafından sağlanan üst düzey yöntemler, Nesnesi sınıfına otomatik olarak eklenir. Bu, Çekirdek yöntemlerinin her şeyde görüneceği anlamına gelir.

private method 'puts' called for main:Object (NoMethodError) hatası, yalnızca varolan ürünlerin var olduğunu ancak özel olarak kapsamlandığını bildiriyor.

ree-1.8.7-2011.03 :001 > puts "test" 
test 
ree-1.8.7-2011.03 :004 > self.send(:puts, "hi") 
hi 

GÜNCELLEME

Çekirdek yöntemleri için sihirli yoktur. Kapsam atlamalı veya başka bir şey yok. self kullanırken kapsamı karışıklık satırları düşünüyorum. self'u kullanarak özel yöntemlere erişiminiz yok.

class PutsTest 

    def success_puts 
    private_puts 
    end 

    def failed_puts 
    # trying to access a private method from self 
    self.private_puts 
    end 

    private 

    def private_puts 
    puts 'hi' 
    end 
end 

kendini kullanarak,

ree-1.8.7-2011.03 :095 > test = PutsTest.new 
ree-1.8.7-2011.03 :096 > test.success_puts 
hi 
ree-1.8.7-2011.03 :097 > test.failed_puts 
NoMethodError: private method `private_puts' called for #<PutsTest:0xd62c48> 
+0

Evet PutsTestdışından çağrılmasına PutsTestiç yöntemini çağırarak gelen kapsamını değişiyor ama neden ben çağırabilir Ben kendimi belirtmezseniz özel yöntem? –

+0

Kendi başına koyar çünkü nesnenin içinde kapsamlanır, doğrudan self.put çağrısı, kendiliğinden gizli olan put yöntemini çağırmaya çalıştığınız anlamına gelir. Cevabımı bazı kodlarla güncellerim. . – mguymon

+0

Umarız bu kod örneği, vs vs self.puts – mguymon