0

バックグラウンド

ルックアップで一致が見つかったことを確認するためにチェックを実行したい多次元ハッシュがありますが、単一次元ハッシュと同じようには機能しないようです。私のコードは、一致が見つかった場合には機能しますが、一致しない場合には機能しません。特定の状況下でハッシュが一致しないキーを自動的に生成する投稿を読んだことがありますが、特に値を設定しなかったため、NIL になると思います。一致しない場合に表示されるエラー メッセージは次のとおりです。

can't convert Hash into String (TypeError)

コンテキストの私のプロジェクトへのリンク: https://github.com/elvisimprsntr/siriproxy-redeye

コードの抜粋とソースへのハイパーリンク:

redeyeconfig.rb

# Channel number and command syntax to actual RedEye device commandIds
# Note: Must all be lower case. Use multiple entries for variability in Siri response.
@cmdId = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))
@cmdId["all"]["cable box"]["0"]         = "/commands/send?commandId=3"
@cmdId["all"]["cable box"]["zero"]      = "/commands/send?commandId=3"
@cmdId["all"]["cable box"]["1"]         = "/commands/send?commandId=4"

siriproxy-redeye.rb

  def send_command(command)
    commandid = @cmdId[@reRoom][@reDevice][command.downcase.strip]
    unless commandid.nil?
        say "OK. Sending command #{command}."
# FIXIT: Does not properly handle no match.  Results in "can't convert Hash into String (TypeError)"
#   This may be due to the fact that dynamically created multidimensional hash will create new keys if a match is not found which will pass the NIL check.
        Rest.get(@reIp[@reSel] + @roomId[@reRoom] + @deviceId[@reRoom][@reDevice] + commandid)
    else
        say "Sorry, I am not programmed for command #{command}."
    end
    request_completed   
  end

質問

ハッシュを別の方法で定義/初期化する方法、および/または不一致をテストするにはどうすればよいですか?

4

1 に答える 1

1

nilルックアップが失敗した場合は、またはバックを取得しません。String代わりに、空の を取得しますHash

ルックアップが失敗したかどうかcommandid.is_a?(Hash)を確認します。commandid.empty?

于 2012-11-08T13:35:54.073 に答える