我正在介绍一些使用Sinatra制作的刽子手应用程序的Ruby代码。具体来说,我正在查看下面的post "/check" do
路径/功能。函数的前两个步骤是可预测的,即它显示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
答案 0 :(得分: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