如何优先于局部变量的方法

时间:2016-04-24 12:19:04

标签: ruby

我有一个方法和一个名为x的本地变量:

class A
  def x; 5 end
end

x = 10

我想在不使用x的情况下引用方法self.x。例如,我想:

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

返回5。这可能吗?

2 个答案:

答案 0 :(得分:3)

是的,有几种方式:

struct const_version {
  const int   a;
  const char *b;
};
struct const_version *c = (struct const_version *)&nc;

如果您只允许A.new.instance_eval{x()} # => 5 A.new.instance_eval{send(:x)} # => 5 ,那就不可能了。局部变量具有词法范围,并且在模糊的情况下优先于方法。

答案 1 :(得分:0)

有两种方法可以告诉Ruby您希望发送消息而不是本地变量:

  1. 变量不能包含参数:A.new.instance_eval{ x() }
  2. 变量不能有接收器:A.new.instance_eval{ self.x }
  3. 你也可以使用反射:

    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))
    3. 最干净的解决方案是重命名局部变量。