2016-04-24 52 views
1

我有一個方法,並使用相同的名稱x一個局部變量中優先使用方法:如何在一個局部變量

class A 
    def x; 5 end 
end 

x = 10 

我想指的是方法x不使用self.x。例如,我想要:

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

返回5。那可能嗎?

+2

'x'是一個* local *變量。 [全局變量](http://ruby-doc.org/core-2.3.0/doc/syntax/assignment_rdoc.html#label-Global+Variables)以'$'開頭。 – Stefan

+0

呵呵,我雖然在程序主體中指定了一個變量是全局變量,但並不知道有一個實際的全局變量修飾符 – Coirotomas

+0

self.x可能是表達您調用該方法的最乾淨和最清晰的方式。你爲什麼想要以不同的方式表達? –

回答

3

是,在幾個方面:

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

如果只允許x,這是不可能的。局部變量具有詞彙範圍,並且在含糊不清的情況下優先於方法。

+1

對不起,是的,它是爲OP。我剛剛提出了評論。 –

0

有你想要的消息告訴紅寶石兩種方式發送,而不是一個局部變量:

  1. 變量不能有參數:A.new.instance_eval{ x() }
  2. 變量不能有一個接收器:A.new.instance_eval{ self.x }

您也可以使用反射:

  1. A.new.instance_eval{ public_send(:x) }
  2. A.new.instance_eval{ method(:x).() }
    • 因爲Method器具to_proc,#2也可被寫爲A.new.instance_eval(&method(:x))

最乾淨的解決辦法是重命名局部變量。