Ruby には、シェル スクリプト言語のような組み込みのメニュー機能はありません。メニューを作成するときは、可能なオプションのハッシュを作成してそれを操作することを好みます。
def array_to_menu_hash arr
Hash[arr.each_with_index.map { |e, i| [i+1, e] }]
end
def print_menu menu_hash
puts 'Choices:'
menu_hash.each { |k,v| puts "#{k}) #{v}" }
puts
end
def get_user_menu_choice menu_hash
print 'Choice => '
number = STDIN.gets.strip.to_i
menu_hash.fetch(number, nil)
end
def show_menu menu_hash
print_menu menu_hash
get_user_menu_choice menu_hash
end
def user_menu_choice choice_array
until choice = show_menu(array_to_menu_hash(choice_array)); end
choice
end
array = %w{a b c d}
choice = user_menu_choice(array)
puts "User choice was #{choice}"
魔法が起こるarray_to_menu_hash
:
Hashの[]
メソッドは、形式の配列を[ [1, 2], [3, 4] ]
hash に変換し{1 => 2, 3 => 4}
ます。この配列を取得するには、まずeach_with_index
元のメニュー選択配列を呼び出します。これは、反復時に [element, index_number] を発行する Enumerator を返します。この Enumerator には 2 つの問題があります。1 つ目は、Hash[] が Enumerator ではなく配列を必要とすることです。2 つ目は、Enumerator によって発行された配列の要素の順序が間違っていることです ([index_number, element] が必要です)。これらの問題は両方とも で解決され#map
ます。これにより、Enumerator が each_with_index から配列の配列に変換され、それに与えられたブロックによって結果を変更できるようになります。この場合、ゼロから始まるインデックスに 1 を追加し、サブ配列の順序を逆にします。