在不同的上下文中使用方法,instance_eval添加不需要的参数

时间:2011-10-02 00:41:36

标签: ruby metaprogramming

我正在尝试调用对象foo的方法,就好像它是对象栏的方法一样。我尝试了两种方法:

1。取消绑定和绑定 - 由于不同的类

而失败
class Foo
  def initialize
    @name = "John"
  end
end

class Bar
  def out
    puts @name
  end
end

foo = Foo.new
bar = Bar.new

m = bar.method :out
foo.instance_eval m.unbind.bind(foo)

2。从方法

开始的proc上的instance_eval

这失败的原因是instance_eval将接收者作为附加参数传递而不是真正的接收者(afaik)

class Foo
  def initialize
    @name = "John"
  end
end

class Bar
  def out
    puts @name
  end
end

foo = Foo.new
bar = Bar.new

m = bar.method :out
proc = m.to_proc
foo.instance_eval &proc

它表示:“out”中的:堆栈跟踪中错误的参数数量(1表示0)(ArgumentError)

但是,当我使用它而不是最后一行时,它可以正常工作:

foo.instance_eval {
  puts @name
}

1 个答案:

答案 0 :(得分:2)

问题是#instance_eval向块发送一个参数,该参数是它自己的对象。所以你可以做到:

# ...
class Bar
  def out(foo_object)
    [@name, foo_object, self]
  end
end
# ...
m = bar.method :out
foo.instance_eval &m    # => ["John", #<Foo:0x1c11b10>, #<Bar:0x1bb2470>]

参数是调用方法的地方,self来自此处的方法。我不知道如何在不解析这个额外参数的情况下调用该方法。