2016-09-08 4 views
3

ich mit der Ruby include Stichwort am Experimentieren, wie unten gezeigt:Warum Modul außerhalb der Klasse enthalten fügt Instanzmethoden zur Klasse der Objekte

module A 
    def show 
    puts "working" 
    end 
end 

include A 

class E 
end 

class D 
end 

e = E.new 
d = D.new 
e.show 
d.show 

o = Object.new 
puts o.respond_to?("show") 

******************************output**************** 

working 
working 
true 

Ich erwarte Ausgang undefined method zu sein, aber es gibt mir die korrekte Ausgabe ist zu geben. Ich habe auch beobachtet, dass das show-Verfahren, das in module A definiert ist, eine Instanzmethode von Object wird.

Warum werden diese Methoden Instanzmethoden der Klasse Object? Bitte helfen Sie mit, dieses Konzept zu verstehen.

+0

Wert zu lesen: [Was ist der Ruby Top-Level?] (Https://banisterfiend.wordpress.com/2010/11/23/what-is-the-ruby-top-level/) – Stefan

Antwort

3

Da Instanzen der Klasse Class erben von Object.

So Module, enthalten in Object auf Instanzen von Class ‚s Instanzen (Instanzen Ihrer E und D Klassen) zur Verfügung stehen.

class A 
end 

module B 
    def test; :hi end 
end 
#=> test 

include B 
#=> Object 

A.new.test 
#=> :hi 

Object.new.test 
#=> :hi 

Mit include B in der obersten Ebene geschrieben bedeutet includeB in Object ing.

include B ist die äußerste Kontext entspricht:

class Object 
    include B 
end 

die einzige Klasse, deren Instanzen nicht Modul B ‚s Methoden gemeinsam ist BasicObject.

+0

Aus diesem Grund Verhalten, das man 'show' nennen könnte, auch eine Nummer' 5.show' – sokkyoku

+0

, aber ich habe das Modul "A" nicht in die "Objekt" -Klasse aufgenommen ?? –

+0

@sanjay einschließlich im äußersten Bereich bedeutet 'include''ing in' Objekt' :) –

Verwandte Themen