2016-11-27 3 views
2

Also, was ich gelernt habe, ist, dass, wenn ich eine Variable auf ein Objekt z.Haben Ruby-Instanzvariablen Zugriffsmodifizierer?

my_object.variable 

Verfahren genannt variable wird, um den Wert von variable

def variable 
    @variable 
end 

In Java Rückkehr gibt es Zugriffsmodifikatoren. Wie kann Ruby Access-Modifikatoren verwenden, wenn Getter-Methoden nach ihren Variablen benannt sind?

Antwort

7

Zuerst gibt es ein bisschen Terminologie in der Frage zu bereinigen, bevor Sie es beantworten.

Einer ist, dass Sie nie Variablen "aufrufen". Der Rubin Ausdruck

my_object.variable 

ist ein Methodenaufruf. Es gibt keinen variablen Aufruf. Sie rufen Methoden und keine Variablen auf. Auch wenn die Methode variable heißt. :)

Die zweite ist, wenn Sie die Methode wie folgt

def variable 
    @variable 
end 

entweder direkt oder durch

sagen
attr_reader :variable 

Dann haben Sie eine Methode variable und eine @variable namens Variable mit dem Namen tat definieren.

Jetzt, um die Frage zu beantworten.

Rubin legt Zugriffsmodifikatoren public, protected und private auf Methoden nur, und nicht auf Variablen. Zugriffssteuerungen auf Variablen sind nicht wirklich sinnvoll, da sie nur innerhalb der Methoden eines Objekts referenziert werden und niemals mit einem Präfix! Mit anderen Worten, Sie können dies niemals schreiben:

[email protected] 

Das ist nur ein Syntaxfehler. Sie können

obj.var 

schreiben, wo var der Name einer Methode. Und die Zugriffskontrollen gelten nur für diese Methode.

Die Tatsache, dass Sie möglicherweise Variablen und Methoden mit dem gleichen Namen machen (mit Ausnahme der @) ist eigentlich egal. Nur Methoden haben Zugriffskontrollen.

Hoffnung, die hilft, einige verständliche Verwirrung aufzuklären!

+0

Danke. Kann ich in Java "Call Variable" sagen, wenn ich 'my_object.variable' verwende? Ich verstehe, warum ich nicht in Ruby kann. –

+1

Wenn Sie "Anruf" verwenden, um "Zugang" zu meinen, dann wird es von den meisten Leuten verstanden werden. Aber da wir im Allgemeinen von "Funktionsaufrufen" und "Methodenaufrufen" sprechen, ist es wahrscheinlich am besten, den Begriff zu vermeiden, wenn von Variablen gesprochen wird. Aber die Leute werden dich in Java verstehen, obwohl ich denke, dass "Zugriff" oder "Lesen" besser für Variablen ist. Sie rufen Methoden auf, lesen aber Variablen. Wie Sie bemerkt haben, können Sie es in Ruby wirklich nicht sagen. :) Ruby und Java sind hier tatsächlich ganz anders. –

+0

Technisch gesehen gehören Instanzvariablen zu Objekten (auch Instanzen genannt), nicht zu Klassen. Eine Instanzvariable kann nicht von einem anderen * Objekt * aus gesehen werden, nicht von einer anderen Klasse. (Z. B. kann es von einer Methode in einer Unterklasse oder Oberklasse gesehen werden.) –

2

Es gibt mehrere Möglichkeiten, eine Methode in Ruby als privat zu definieren.

Verwenden private auf alle späteren Methoden privat:

class Foo 
    def public_method 
    end 

private 

    def private_method 
    end 
end 

Oder ein Verfahren privat machen, nachdem Sie es definiert:

class Foo 
    def public_method 
    end 

    private :public_method # public_method is now private 
end 

Oder - da die Methodendefinition gibt ein Symbol zu - dies auch funktioniert:

class Foo 
    private def method_name 
    end 
end 
Verwandte Themen