![](/img/trans.png)
[英]Why does instance_eval succeed with a Proc but not with a Lambda?
[英]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
返回一個String
和String
■不要回應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.