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

我认为您的代码存在误解。

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 回答
0

像这样调用的问题rescue在于它捕获的错误比您想要的错误更多,因此可以隐藏问题。因此,“正确的方法”是仅解决您期望的错误:

begin
   reply[:user][:interface][:data][0][:value].presence || 'simple'
rescue NoMethodError
  'simple'
end
于 2013-02-14T15:43:30.320 回答
0

“受保护的方法链接”的一种通用模式是使用https://github.com/raganwald/andand 你可以这样写(信用sawa):

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

但老实说,明确的风格通常更好

于 2013-02-14T15:51:27.783 回答
0
interface = [:user, :interface, :data, 0, :value]
.inject(reply){|h, k| h = h.fetch(k, {})}
.presence ||
'simple'
于 2013-02-14T15:37:07.267 回答