簡體   English   中英

為什么在使用to_proc而不是Proc.new調用instance_eval時出現錯誤?

[英]Why am I getting an error calling instance_eval with to_proc and not with Proc.new?

我正在這樣做,它的工作原理是:

class B
  def value
    "X"
  end
end

class A
  def initialize(context)
    @context = context
  end

  def m
    Proc.new do
      value
    end
  end

  def execute
    @context.instance_eval(&m)
  end
end

A.new(B.new).execute #=> "X"

但是調用m.to_proc無法正常工作...

class B
  def value
    "X"
  end
end

class A
  def initialize(context)
    @context = context
  end

  def m
    value
  end

  def execute
    @context.instance_eval(&m.to_proc)
  end
end

A.new(B.new).execute #=> NameError: undefined local variable or method `value' for #<A:0x007fae2ab02040 @context=#<B:0x007fae2ab02108>>

我想知道這兩個示例為何不同,以及如何使其與to_proc

在第二個片段中,您正在調用m ,該value返回未定義的調用value的結果。 即使如果不知何故神奇地調用B#value ,則B#value返回一個StringString ■不要回應to_proc ,所以你會得到一個NoMethodError那里。)在第一個片段,你叫m ,它返回一個Proc

看起來您正在嘗試傳遞方法m 本身,而不是調用它的結果。 在Ruby中,方法不是對象,所以您不能只是抓住它們並傳遞它們(即使方法是對象,那么m仍然是調用m的語法,而不是引用它的語法)。 您必須首先使用Object#method方法向Ruby的反射API請求該方法的反射代理,該方法返回代表該方法的Method對象:

@context.instance_eval(&method(:m).to_proc)

注意,這里對to_proc的調用是完全多余的,因為如果參數還不是Proc ,則&仍然會調用to_proc (您之前可能已經看過類似foo.map(&:bar)東西,它將調用Symbol#to_proc 。)

@context.instance_eval(&method(:m))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM