只在Ruby块中提供内容

时间:2009-10-18 00:47:09

标签: ruby dsl

有没有办法让方法和功能只在块内可用?我想做什么:

some_block do
    available_only_in_block
    is_this_here?
    okay_cool
end

is_this_here?okay_cool等只能在该区块内访问,而不能在该区域外访问。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

将具有您想要可用的方法的对象作为参数传递给块。这是一种在Ruby中广泛使用的模式,例如IO.openXML builder

some_block do |thing|
    thing.available_only_in_block
    thing.is_this_here?
    thing.okay_cool
end

请注意,您可以更接近使用instance_evalinstance_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"