2016-04-24 11 views
1

Ich habe eine Methode und eine lokale Variable mit dem gleichen Namen x:Wie Vorrang ein Verfahren über eine lokale Variable geben

class A 
    def x; 5 end 
end 

x = 10 

Ich mag x auf das Verfahren beziehen, ohne self.x zu verwenden. Zum Beispiel möchte ich:

A.new.instance_eval{x} # => 10 

5 zurückzukehren. Ist das möglich?

+2

'x' ist eine * lokale * Variable. [Globale Variablen] (http://ruby-doc.org/core-2.3.0/doc/syntax/assignment_rdoc.html#label-Global+Variables) beginnen mit einem '$'. – Stefan

+0

Oh, ich hatte eine Variable im Body des Programms zugewiesen war global, wusste nicht, dass es eine tatsächliche globale Variable Modifikator – Coirotomas

+0

self.x ist wahrscheinlich die sauberste und klarste Art und Weise auszudrücken, dass Sie die Methode aufrufen. Warum willst du es anders ausdrücken? –

Antwort

3

Ja, in mehrfacher Hinsicht:

A.new.instance_eval{x()} # => 5 
A.new.instance_eval{send(:x)} # => 5 

Wenn Sie nur x ermöglichen, ist es unmöglich. Lokale Variablen haben einen lexikalischen Geltungsbereich und haben im Falle einer Mehrdeutigkeit Vorrang vor der Methode.

+1

Sorry, ja, es war für das OP. Ich habe gerade den Kommentar verschoben. –

0

Es gibt zwei Möglichkeiten Rubin zu sagen, dass Sie eine Nachricht möchten senden anstelle einer lokalen Variablen:

  1. Variablen können keine Argumente haben: A.new.instance_eval{ x() }
  2. Variablen können nicht einen Empfänger haben: A.new.instance_eval{ self.x }

Sie könnten auch Reflexion verwenden:

  1. A.new.instance_eval{ public_send(:x) }
  2. A.new.instance_eval{ method(:x).() }
    • seit Method implementiert to_proc, # 2 auch als A.new.instance_eval(&method(:x))

Die sauberste Lösung wäre, die lokalen Variable umbenennen geschrieben werden kann.