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(:meow) {|q| q = 'foo'}
现在让我们用我们看到的来分解choice
。它需要一个 name (: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"