0

この場合、変数を簡単かつ簡単な方法で割り当てるにはどうすればよいでしょうか。

interface = reply[:user][:interface][:data][0][:value].presence || 'simple'

配列キーreply[:user][:interface]が存在する場合-私はデータチェーン全体(この場合)を持っていますが、存在しない場合-私はを取得しundefined method '[]' for nil:NilClassます。一般に、パス内のキーのいずれかが存在しない場合にデフォルトを割り当てるメソッドが必要です。今私はそれを次のようにします:

a = b[:asd][:qwe] rescue 5

これは機能しますが、適切な方法のようには見えません。

4

4 に答える 4

0

「保護されたメソッドチェーン」の一般的なパターンの1つは、https://github.com/raganwald/ であり、これを使用して次のように記述できます(credit sawa):

interface = [:user, :interface, :data, 0, :value]
.inject(reply){|h, k| h.andand[k] } || 'simple'

しかし正直なところ、明示的である方が良いスタイルであることがよくあります

于 2013-02-14T15:51:27.783 に答える
0

このように呼び出す場合の問題rescueは、必要なエラーよりも多くのエラーをトラップするため、問題を隠すことができることです。したがって、「適切な方法」は、予想されるエラーのみを救済することです。

begin
   reply[:user][:interface][:data][0][:value].presence || 'simple'
rescue NoMethodError
  'simple'
end
于 2013-02-14T15:43:30.320 に答える
0
interface = [:user, :interface, :data, 0, :value]
.inject(reply){|h, k| h = h.fetch(k, {})}
.presence ||
'simple'
于 2013-02-14T15:37:07.267 に答える
0

あなたのコードには誤解があると思います。

不足している可能性があるreply[:user][:interface][:data][0][:value]場合は直接作業するべきではありませんが、[:interface]

reply[:user].has_key?(:interface) && reply[:user][:interface][:data][0][:value]

その上に、[:data]または欠落している可能性がある場合は、これらすべてのデータを使用する前に、いくつかの検証を行う必要が[:data][0]あります[:data][0][:value]

于 2013-02-14T15:41:06.707 に答える