0

stackoverflow に関する以前の質問と回答をふるいにかけましたが、質問のほとんどがわかりました。関数呼び出しを proc または同様のコンテナー内に配置しないと、ハッシュ内に配置できないことがわかりました。

私が最終的にやろうとしているのは、メニューを表示し、ユーザー入力を取得してから、ハッシュを反復処理し、指定された関数を実行することです:

def Main()
    menu_titles = {"Answer1" => Proc.new{Choice1()}}
    Menu(menu_titles)
end

def Choice1()
    puts "Response answer"
end

def Menu(menu_titles)
   menu_titles.each_with_index do |(key, value),index|
        puts "#{index+1}. #{key}"
   end 

user_input = 0 

   menu_titles.each_with_index do |(key, value), index|
        if index.eql?(user_input)
           menu_titles[value]
           break
        end 
   end 
end

Main()

私が今抱えている問題は、ハッシュが呼び出す関数を入力していないことです。リターンまたは「プット」のどちらを使用しても、空白行が表示されるか、まったく表示されません。誰かが私のコードについて他の推奨事項を持っている場合は、私もすべて耳にします。正直なところ、私はプロシージャを使用するのが好きではありませんが、それは主に、プロシージャがどのように機能し、どこで使用するかを完全には知らないためです。

今私が持っている私のメニューのために:

user_input = 1
if user_input == 1
   Choice1()
...
end
4

1 に答える 1

2

これをリファクタリングする方法は次のとおりです。

class Menu
  attr_reader :titles

  # initialize sets up a hard-coded titles instance variable,
  # but it could easily take an argument.
  def initialize 
    @titles = { 
      "Answer1" => Proc.new{ puts "choice 1" },
      "Answer2" => Proc.new{ puts "choice 2" } 
    }
  end

  # This is the only public instance method in your class,
  # which should give some idea about what the class is for
  # to whoever reads your code
  def choose
    proc_for_index(display_for_choice)
  end

  private

    # returns the index of the proc.
    def display_for_choice
      titles.each_with_index { |(key,value), index| puts "#{index + 1}. #{key}" }
      gets.chomp.to_i - 1 # gets will return the string value of user input (try it in IRB)
    end 

    # first finds the key for the selected index, then 
    # performs the hash lookup.
    def proc_for_index(index)
      titles[titles.keys[index]]
    end
end

Ruby (または一般的なオブジェクト指向プログラミング) に真剣に取り組んでいる場合は、コードを動作固有のクラスにパッケージ化する利点について学ぶことを強くお勧めします。この例では、これを行うことができます。

menu = Menu.new
proc = menu.choose
#=> 1. Answer1
#=> 2. Answer2
2 #(user input)

proc.call
#=> choice 2

そして、実際には 1 行で実行できます。

Menu.new.choose.call
于 2012-11-13T20:59:45.497 に答える