只在Ruby块中提供东西

Jus*_*iey 2 ruby dsl

有没有办法让方法和功能只在块内可用?我正在做的事情:

some_block do
    available_only_in_block
    is_this_here?
    okay_cool
end
Run Code Online (Sandbox Code Playgroud)

但是is_this_here?,okay_cool等仅仅是访问该块里面,不是外面.有什么想法吗?

Bri*_*ell 6

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

some_block do |thing|
    thing.available_only_in_block
    thing.is_this_here?
    thing.okay_cool
end
Run Code Online (Sandbox Code Playgroud)

需要注意的是,你可以得到更接近你的要求使用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
Run Code Online (Sandbox Code Playgroud)

如果你通过论证,你总是知道你会指的是什么:

def with_foo
  yield Foo.new
end

with_foo { |x| x.bar }      #=> "Hello"
bar = 10
x = 20
with_foo { |x| x.bar }      #=> "Hello"
Run Code Online (Sandbox Code Playgroud)