Hãy ví dụ này Proc:Làm cách nào tôi có thể gọi một Proc có một khối trong một ngữ cảnh khác?
proc = Proc.new {|x,y,&block| block.call(x,y,self.instance_method)}
Phải mất hai đối số, x và y, và cũng là một khối.
Tôi muốn thực thi khối đó bằng các giá trị khác nhau cho bản thân. Một cái gì đó như thế này gần như hoạt động:
some_object.instance_exec("x arg", "y arg", &proc)
Tuy nhiên điều đó không cho phép bạn đi qua một khối. Điều này cũng không hoạt động
some_object.instance_exec("x arg", "y arg", another_proc, &proc)
cũng không
some_object.instance_exec("x arg", "y arg", &another_proc, &proc)
Tôi không chắc chắn những gì khác có thể làm việc ở đây. Điều này có thể, và nếu như vậy làm thế nào để bạn làm điều đó?
Chỉnh sửa: Về cơ bản nếu bạn có thể nhận tệp rspec này để chuyển bằng cách thay đổi phương thức change_scope_of_proc
, bạn đã giải quyết được sự cố của mình.
require 'rspec'
class SomeClass
def instance_method(x)
"Hello #{x}"
end
end
class AnotherClass
def instance_method(x)
"Goodbye #{x}"
end
def make_proc
Proc.new do |x, &block|
instance_method(block.call(x))
end
end
end
def change_scope_of_proc(new_self, proc)
# TODO fix me!!!
proc
end
describe "change_scope_of_proc" do
it "should change the instance method that is called" do
some_class = SomeClass.new
another_class = AnotherClass.new
proc = another_class.make_proc
fixed_proc = change_scope_of_proc(some_class, proc)
result = fixed_proc.call("Wor") do |x|
"#{x}ld"
end
result.should == "Hello World"
end
end
+1 để cung cấp kiểm tra bề mặt các vấn đề một cách rõ ràng – dbenhur
1 cho kỳ thi này, cảm ơn bạn, mà làm cho nó rất dễ dàng để xem những gì bạn muốn. – joelparkerhenderson