1

Sinatraで作成された絞首刑執行人アプリのRubyコードをステップスルーしています。post "/check" do具体的には、以下のパス/関数を見ています。関数の最初の2つのステップは予測可能です。つまり、final_word変数を表示し、次に変数を表示しchar_clickedますが、デバッガーはこのHash.newを表示します。

Hash.new {|hash,key| hash[key.to_s] if Symbol === key }

関数に進む前に。post "/check"この時点でなぜ新しいハッシュを作成しているのかわかりません。これはコードでは明示されておらず、なぜこれが舞台裏で行われるのかは私にはわかりません。以下にcorrect_guessメソッドも含めました。これは、「

final_word = session[:word]
(rdb:3) n
hangman.rb:79
char_clicked = params[:char_clicked]
(rdb:3) n
/Users/mm/.rvm/gems/ruby-1.9.2-p290@rails3tutorial/gems/sinatra-1.3.3/lib/sinatra/base.rb:916
Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
(rdb:3) n
hangman.rb:80
correct_guess = Game.correct_guess?(char_clicked, final_word)

パスを確認してください

post "/check" do
  debugger
  final_word = session[:word]
  char_clicked = params[:char_clicked]
  correct_guess = Game.correct_guess?(char_clicked, final_word)

  if correct_guess
    session[:revealed_word] = Word.reveal(session[:revealed_word], char_clicked, final_word)
    session[:chars_left] = Word.chars_left(session[:revealed_word])
  else
    session[:incorrect_guesses] += 1
  end
  win = Game.win?(session[:chars_left], session[:incorrect_guesses])

  {:word => session[:revealed_word], :correct_guess => correct_guess, :incorrect_guesses => session[:incorrect_guesses], :win => win}.to_json
end

ゲームcorrect_guessメソッド

def correct_guess?(char_clicked, final_word)
  final_word.include?(char_clicked)
end
4

1 に答える 1

4

Sinatraはparams、「無関心アクセス」のハッシュを作成しています(したがって、ハッシュキーは文字列または記号で交換可能にアクセスできます)。

Hash.newキーが存在しない場合に返す値を決定するためにブロックを取ります。

例:

>> sh = Hash.new
=> {}
>> sh["key"] = "value"
=> "value"
>> sh[:key]
=> nil

>> ih = Hash.new { |hash, key| hash[key.to_s] if Symbol === key }
=> {}
>> ih["key"] = "value"
=> "value"
>> ih[:key]
=> "value"

ハッシュブロックにアクセスしようとするとparams[:char_clicked]、デバッガーがブロックを含む完全な行をダンプするように実行されます(ハッシュはその時点では実際には作成されていません)。

h = Hash.new { |hash, key| hash[key.to_s] if Symbol === key }
debugger
h["invalid_key"]

->

sample.rb:5
h["invalid_key"]
(rdb:1) n
sample.rb:3
h = Hash.new { |hash, key| hash[key.to_s] if Symbol === key }

ブロックが別の行にある場合、コードのどの部分(つまりブロックのみ)が実行されているかを簡単に確認できます。

h = Hash.new do 
  |hash, key| hash[key.to_s] if Symbol === key
end
debugger
h["invalid_key"]

->

sample.rb:7
h["invalid_key"]
(rdb:1) n
sample.rb:4
|hash, key| hash[key.to_s] if Symbol === key
于 2012-10-04T02:28:34.697 に答える