【发布时间】:2015-04-09 17:10:03
【问题描述】:
我正在开发一个 Rails API,它接收 POST 的 json 输入并相应地处理事情。当前元素涉及奖品和奖品代码,我有一个关于哈希、数组和 ruby .first 方法的问题。
免责声明:我正在从旧的 PHP 应用程序接收 json,到目前为止,我无法编辑该应用程序的输出。我正在接受它,并且正在尽我所能处理它。
奖品代码以嵌套元素的形式出现在更大的对象中,但我们现在只关注代码。这是我得到的:
"codes" => {
"0"=>{"Code"=>"1582566"},
"1"=>{"Code"=>"2153094"},
"2"=>{"Code"=>"3968052"},
"3"=>{"Code"=>"4702730"},
"4"=>{"Code"=>"5582567"},
"5"=>{"Code"=>"6153097"},
"6"=>{"Code"=>"7968052"},
"7"=>{"Code"=>"8702730"},
"8"=>{"Code"=>"9582567"},
"9"=>{"Code"=>"1053097"}
}
从那里开始,一切都被拉到一个块中,然后我分别处理每个代码。
我将从我的最终解决方案开始,我们将按原路返回。为了得到一个代码,只是每个代码中的数字,这是我的解决方案:
code[1].first.second.to_i 返回1582566
现在让我们倒带,从头开始。
code 返回"0"=>{"Code"=>"1582566"}
这是有道理的。现在我想跳过第一级"0"。
code[1] 返回{"Code"=>"1582566"}
到目前为止,所有这些都是有道理的,但这就是事情变得奇怪的地方。从那时起,我想抓住第二个项目,也许你可以称它为这个散列键值对中的值。不幸的是,ruby .second 不适用于哈希,我收到 undefined method 错误,但 .first 出于某种原因。输出让我感到困惑。
code[1].first 返回["Code", "4582566"]
现在突然之间,哈希是一个数组。为什么ruby.first数组方法将键值哈希变成数组?
我做了一些调查,发现:first 是code[1].methods 的输出中列出的一个方法,但我似乎找不到任何关于它的作用的文档。
code[1].class 返回Hash
但是,当我运行 code[1].methods 和 Hash.methods 时,为什么会返回一组完全不同的可用方法? :first 方法列在 code[1].methods 的输出中,但 NOT 在 Hash.methods 的输出中,并且它也不在此处的可用方法列表中:
http://ruby-doc.org/core-2.1.5/Hash.html
如果它们都是哈希,为什么它们的不同方法可用?它与类方法与实例方法有关吗?
我仍然对 .first 方法对哈希的作用感到困惑。
最后我意识到了一种更好/更清洁的方法来获取code[1]['Code'].to_i,但我仍然对引擎盖下发生的事情感到好奇。
【问题讨论】: