-1

case配列内のすべての要素をリストし、ユーザーが 1 つを選択できるようにして、その要素を処理するステートメントをどのように作成すればよいでしょうか?

私は配列を持っています:

array = [ 'a', 'b', 'c', 'd' ]

最終的には、次のように動作するようにしたいと思います。

Choices:
1) a
2) b
3) c
4) d

Choice => 

ユーザーが 3 を選択した後、ユーザーの選択に基づいて処理を行います。私はbashでかなり簡単にそれを行うことができます。

4

1 に答える 1

1

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 を追加し、サブ配列の順序を逆にします。

于 2013-01-30T17:44:13.070 に答える