TL;DR 响应只是您需要定义一个可在块范围之外访问的变量。
首先,查看 API 的文档:
http://rubydoc.info/gems/highline/HighLine#choose-instance_method
你会看到def choose( *items, &details ),所以选择方法接受任意长度的参数,然后也是一个块。该块是您看到 do ... end 被交给选择调用的地方:
choose do |menu|
menu.choice(:meow) {|q| q = 'foo'}
end
好的,所以我们看到另一种方法,即choice:http://rubydoc.info/gems/highline/HighLine/Menu#choice-instance_method
# File 'lib/highline/menu.rb', line 136
def choice( name, help = nil, &action )
@items << [name, action]
@help[name.to_s.downcase] = help unless help.nil?
update_responses # rebuild responses based on our settings
end
现在让我们使用从choice 看到的内容分解.choice(:meow) {|q| q = 'foo'}。它需要一个名称 (:meow),如果没有提供帮助,则默认为 nil(因此在我的示例中调用它是 nil),最后采用另一个块 {|q| q = 'foo'}。
我的示例计算结果为:
1. meow
? 1
=> "foo"
q
=> NameError: undefined local variable or method `q' for main:Object
为什么?因为 q 仅在传入的块的范围内定义。一旦评估了该 proc,您就无法访问它。所以你需要做的是:
1.9.3-p448 :015 > choose do |menu|
1.9.3-p448 :016 > menu.choice(:meow) { @foo = 'foo'}
1.9.3-p448 :017?> end
1. meow
? 1
=> "foo"
1.9.3-p448 :018 > @foo
=> "foo"