有没有办法让方法和功能只在块内可用?我想做什么:
some_block do
available_only_in_block
is_this_here?
okay_cool
end
但is_this_here?
,okay_cool
等只能在该区块内访问,而不能在该区域外访问。有什么想法吗?
答案 0 :(得分:6)
将具有您想要可用的方法的对象作为参数传递给块。这是一种在Ruby中广泛使用的模式,例如IO.open
或XML builder。
some_block do |thing|
thing.available_only_in_block
thing.is_this_here?
thing.okay_cool
end
请注意,您可以更接近使用instance_eval
或instance_exec
的要求,但这通常是一个坏主意,因为它会产生相当令人惊讶的后果。
class Foo
def bar
"Hello"
end
end
def with_foo &block
Foo.new.instance_exec &block
end
with_foo { bar } #=> "Hello"
bar = 10
with_foo { bar } #=> 10
with_foo { self.bar } #=> "Hello
如果你传入一个参数,你总是知道你会指的是什么:
def with_foo
yield Foo.new
end
with_foo { |x| x.bar } #=> "Hello"
bar = 10
x = 20
with_foo { |x| x.bar } #=> "Hello"