Ruby 鲁比:哈什。新来这里干什么

Ruby 鲁比:哈什。新来这里干什么,ruby,sinatra,Ruby,Sinatra,我正在浏览用Sinatra制作的hangman应用程序的一些Ruby代码。具体来说,我正在查看下面的post”/check“do路径/函数。函数的前两个步骤是可预测的,即,它显示final\u word变量,然后单击char\u变量,但调试器随后显示此哈希。新建 Hash.new {|hash,key| hash[key.to_s] if Symbol === key } 在函数中继续之前。我不明白为什么post”/check“此时正在创建一个新的散列。代码中没有明确说明,我也不清楚为什么会在

我正在浏览用Sinatra制作的hangman应用程序的一些Ruby代码。具体来说,我正在查看下面的
post”/check“do
路径/函数。函数的前两个步骤是可预测的,即,它显示
final\u word
变量,然后单击
char\u
变量,但调试器随后显示此哈希。新建

Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
在函数中继续之前。我不明白为什么
post”/check“
此时正在创建一个新的散列。代码中没有明确说明,我也不清楚为什么会在幕后发生这种情况。我还包括了下面正确的_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
博弈正确猜测法

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

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\u clicked]
时,哈希块将执行,因此调试器将转储包含该块的完整行(此时实际上没有创建哈希):

->

当块位于单独的行上时,更容易看到正在执行代码的哪一部分(即仅块):

->


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\u clicked]
时,哈希块将执行,因此调试器将转储包含该块的完整行(此时实际上没有创建哈希):

->

当块位于单独的行上时,更容易看到正在执行代码的哪一部分(即仅块):

->


sinatra-1.3.3/lib/sinatra/base.rb的第916行附近发生了什么事?我想第925行就是你所说的,创建无关参数散列是一种方法,也许它正在创建一个缓存的“访问无关的散列”第一次调用
params
方法时。在
sinatra-1.3.3/lib/sinatra/base.rb
的第916行附近发生了什么?我想第925行就是你所说的,创建无关params散列
params
是一种方法,也许它正在创建一个缓存的“访问无关的散列”第一次调用
params
方法时。
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