Ruby:Hash.new在这做什么

时间:2012-10-04 02:04:45

标签: ruby sinatra

我正在介绍一些使用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

1 个答案:

答案 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
相关问题