2010-02-19 6 views
5

Kann mir jemand helfen, Folgendes zu verstehen? Ich habe den folgenden Code in test.rb:Methode erklärt außerhalb der Klasse ist automatisch enthalten?

class Dog 
end 
// bark is declared outside of Dog class 
def bark 
    puts 'Woof!' 
end 

dann in irb:

>> source 'test.rb' 
>> a = Dog.new 
=> #<Dog:0x117f614> 
>> a.bark 
Woof! 
=> nil 

Warum Methode bark auch in Hunden Instanz existiert, obwohl es außerhalb der Klasse deklariert wird? Weil es in der gleichen Datei ist? Vielen Dank!

Antwort

3

Wenn Sie eine Methode in dem „globalen“ scope (außerhalb jeder Klasse), dann wird das Verfahren eine private Methode von Objekt gemacht:

#!/usr/bin/ruby1.8 

class Dog 
end 

p Object.respond_to?(:bark, true)  # => false 

def bark 
    puts "Woof!" 
end 

p Object.respond_to?(:bark, true)  # => true 

Objekt ist in der Ahnenkette aller Objekte, einschließlich Hund:

dog = Dog.new 
p dog.class.name    # => "Dog" 
p dog.class.superclass.name # => "Object" 

Deshalb können Hunde (und tatsächlich alle Objekte) jetzt bellen. wobei das Verfahren privat, Sie haben jedoch instance_eval verwenden, um es mit einem expliziten Empfänger zu nennen:

dog.instance_eval { bark } # => "Woof!" 

Oder Sie es mit einem impliziten Empfänger ohne Gymnastik benötigt anrufen:

bar # => "Woof!" 
+0

Es macht Sinn, danke !! – penger

1

Ihr genaues Beispiel funktioniert nicht in Ruby 1.9. (Abgesehen von der schlechten Kommentar Syntax.)

jedoch ein Verfahren in dem obersten Ebene Umfang erklärt wird es eine private Methode auf Object machen, offenbar:

>> Object.private_methods.include? :bark 
=> true 

Vielleicht in Ihrem Ruby (1.8?) Das ist eine öffentliche Methode?

+0

Es ist nicht öffentlich in 1.8 auch nicht. Ich weiß nicht, warum der OP-Code nicht beschwert hat "private Methode Bark genannt ...". Es hat etwas mit der IRB "Source" -Linie zu tun. Ich weiß nicht, was das anders macht als "verlangen". –

+0

(In 1.8.7) scheint dies zu gelten - wenn ich anstelle von Quelle brauche, bekomme ich tatsächlich diesen Fehler. Source ist vermutlich dasselbe wie das eingebaute Bash, das den Inhalt der Datei enthält, so als ob sie getippt worden wäre - daher wäre eine private Methode zugänglich. – Shadowfirebird

Verwandte Themen