2009-03-18 8 views
1

Ich habe versucht, dieses Beispiel Ruby Code from a blog entry zu verstehen, der besagt, dass es die Symbole verwendet: DEFAULT,: say und: @message "nach Kennungen suchen". Aber von dem, was ich sagen kann, wird nicht nach den Identifikatoren gesucht, sondern nach den Werten, die diesen Identifikatoren zugeordnet sind. Ich dachte, Bezeichner wären Namen von Variablen, Methoden usw. Also wären die Bezeichner "DEFAULT", "also" und "Nachricht"? Die Ausgabe des Programms ist unten.Sucht dieser Ruby-Code Identifikatoren oder die damit verbundenen Werte?

Warum sollten Sie auch eine Kennung suchen?

class Demo 
    # The stuff we'll look up. 
    DEFAULT = "Hello" 
    def initialize 
    @message = DEFAULT 
    end 
    def say() @message end 

    # Use symbols to look up identifiers. 
    def look_up_with_symbols 
    [Demo.const_get(:DEFAULT), 
    method(:say), 
    instance_variable_get(:@message)] 
    end 
end 

dem = Demo.new 
puts dem.look_up_with_symbols 

Wenn ich den Code ausführen bekomme ich diese Ausgabe:

Hello 
#<Method: Demo#say> 
Hello 

Antwort

2

Der Beispielcode verwendet Symbole auf drei Dinge zu erhalten: der Wert des DEFAULT const (via :DEFAULT zugegriffen wird), ein Verfahren, Objekt (Zugriff über :say), und der Wert einer Instanzvariable (via :@message zugegriffen wird). Keines der drei Objekte wurde mit einem Symbol definiert, Sie können jedoch mit Symbolen darauf zugreifen.

Es ist ein ziemlich triviales Beispiel. Der größere Punkt ist, dass Symbole verwendet werden können, um auf Konstanten, Methoden und Instanzvariablen zu verweisen, wenn Sie aus irgendeinem Grund nicht direkt über ihre Bezeichner auf sie verweisen möchten. Ich sehe das am häufigsten in der Metaprogrammierung.

0

Ja, diese die Werte verschiedener Identifikatoren nachzuschlagen.

Ich bin mir nicht sicher, was genau Sie versuchen zu tun, aber wenn Sie ein Symbol (: DEFAULT) in eine Zeichenfolge ("DEFAULT") übersetzen müssen to_s (: DEFAULT.to__s). Wenn Sie alle möglichen Bezeichner nachschlagen möchten, hängt es davon ab, wonach Sie suchen.

Ich bekomme die meisten Kilometer aus diesen Methoden beim Debuggen oder Ausprobieren neuer APIs. Der einzige Grund, warum ich diese wahrscheinlich im Produktionscode verwenden würde, ist die Ausgabe einer Art von automatischer Stringdarstellung (XML, HTML, CSV) eines Objekts.