Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby上的Hash方法_Ruby - Fatal编程技术网

ruby上的Hash方法

ruby上的Hash方法,ruby,Ruby,我需要为散列获取一些值,但我不知道如何才能做到! 我的数据: 我搜索ruby方法并在处找到方法值,但该方法只获取第一个数据,如名称、年龄。 如果我使用: name = data.values_at(:name) 返回的字段为PedroÁlvares 但如果我尝试使用: fantasy_name = data.values_at(:fantasy_name) 返回的数据为nil 如何在不使用数据[:sensitive_data][:fantasy_name]的情况下获取字段?您可以通过以下方法

我需要为散列获取一些值,但我不知道如何才能做到! 我的数据:

我搜索ruby方法并在处找到方法值,但该方法只获取第一个数据,如名称、年龄。 如果我使用:

name = data.values_at(:name)
返回的字段为PedroÁlvares
但如果我尝试使用:

fantasy_name = data.values_at(:fantasy_name)
返回的数据为nil


如何在不使用数据[:sensitive_data][:fantasy_name]的情况下获取字段?

您可以通过以下方法获取嵌套值:

data.dig(:sensitive_data,:fantasy_name)#=>“我有力量”

因为您知道应该编写的哈希的正确结构:

data[:sensitive_data][:fantasy_name]
  #=> "I have the power"
您不应该在此处使用
dig
。为什么?假设你不小心写了

data.dig(:sesnitive_data, :fantasy_name)
将返回
nil
(因为
data
没有键
:seInitiative
)。根据上下文的不同,错误可能要过一段时间才会出现,这使得调试比必要时更加困难

相反,如果你写

data[:sesnitive_data][:fantasy_name]
data[:seInitiative_data]
将返回
nil
(因为
data
没有键
:seInitiative_data
),然后
nil[:seInitiative_data]
将引发异常,通知您
nil
没有方法
[]
。这正是您希望发生的事情:您希望立即收到错误通知,并查明错误原因,以便轻松更正代码


和(它们相互调用)有它们的用途(当您事先不知道对象的结构时,例如,哈希键),但当对象的结构已知时,不应使用这些方法。

为什么不使用带括号表示法的嵌套哈希访问?(注意,您可以对链接的“values\u at”?)您不告诉我们什么?Ruby将假定
cpf\u cnpj
是一种方法,但无法找到它。也许您的意思是它是一个字符串或符号,在这种情况下,它需要引号或冒号。我的编辑只是为了删除rails标记,因为这是一个纯粹的Ruby问题。@DaveNewton,我的问题是,如果我有很多嵌套字段,代码就会长大。在本例中,代码很短,但在我的实际案例中,我有很多嵌套字段。非常感谢@CarySwoveland的回答和编辑@EricGomes我认为,如果您有带有任意键的深度嵌套字段,您可能希望将一些逻辑提取到其他内容中,或者在查看数据时重新构造。最有意义的是与上下文相关的。如果你想知道缺少键的错误,有一个
fetch
,它会立即引发
KeyError
。@Stefan,说得好,这是我不知道的。我也不知道
fetch
会占用一个街区;我总是以它的第三种形式来考虑它,将默认值作为参数。
data[:sesnitive_data][:fantasy_name]