2009-06-05 6 views
3

ich über den folgenden kam, während über das Lesen, wie einfach es ist, Methoden in Ruby neu zu definieren:Ist die Längenmethode von Ruby ein Symbol? Warum ist die Länge manchmal die gleiche wie die Länge?

class Array 
    alias :old_length :length 
    def length 
    old_length/2 
    end 
end 
puts [1, 2, 3].length 

Sicher, es ist eine schlechte Idee, aber es macht den Punkt. Aber es stört mich, dass wir so einfach zwischen :length und length und :old_length und old_length wechseln können. Also habe ich es auf diese Weise versucht:

class Array 
    alias old_length length 
    def length 
    old_length/2 
    end 
end 
puts [1, 2, 3].length 

Es funktioniert ganz gut - anscheinend genau wie die erste Version. Ich habe das Gefühl, dass ich etwas übersehen habe, aber ich bin mir nicht sicher, was es ist.

Also, in einem Nutsell, warum sind :name und name austauschbar in diesen Fällen?

Antwort

5

Eine Methode ist kein Symbol, aber ihr Name ist. Nur Schreiben length ruft die Methode length auf. Um den Namen der Methode anstelle der Methode anzugeben, verwenden Sie ein Symbol.

class Array 
    def show_the_difference 
    puts length 
    puts :length 
    end 
end 

['three', 'items', 'here'].show_the_difference 
# prints "3" for the first puts and then "length" for the second 

Der Fall, dass Sie mit alias gefunden ist eine Ausnahme, nur weil alias funktioniert anders als alles andere in der Sprache.

+0

Perfekt: das hilft sehr, und es ist nicht so offensichtlich, dass ich mich schlecht fühle, weil ich es nicht schon weiß. – Telemachus

3

alias ist ein Primitiv, das spezielle Behandlung bekommt und anscheinend sowohl Symbole als auch bloße Namen nehmen kann. Die verwandte alias_method ist nur eine gewöhnliche Methode und muss normale Syntax verwenden.

alias_method :old_length, :length 
Verwandte Themen