【问题标题】:Hashes, arrays, and the ruby '.first' method散列、数组和 ruby​​ '.first' 方法
【发布时间】: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数组方法将键值哈希变成数组?

我做了一些调查,发现:firstcode[1].methods 的输出中列出的一个方法,但我似乎找不到任何关于它的作用的文档。

code[1].class 返回Hash

但是,当我运行 code[1].methodsHash.methods 时,为什么会返回一组完全不同的可用方法? :first 方法列在 code[1].methods 的输出中,但 NOTHash.methods 的输出中,并且它也不在此处的可用方法列表中:

http://ruby-doc.org/core-2.1.5/Hash.html

如果它们都是哈希,为什么它们的不同方法可用?它与类方法与实例方法有关吗?

我仍然对 .first 方法对哈希的作用感到困惑。

最后我意识到了一种更好/更清洁的方法来获取code[1]['Code'].to_i,但我仍然对引擎盖下发生的事情感到好奇。

【问题讨论】:

    标签: ruby arrays json hash


    【解决方案1】:

    在 Ruby 中,Hash is an ordered collection of key/value pairs。我们可以说它们是“有序的”,因为:

    哈希按照插入相应键的顺序枚举它们的值。

    由于这种有序枚举,Enumberable#first method 将添加到哈希的第一个键/值对作为两个项目 [key, value] 的数组返回。

    {}.first # => nil
    {1 => 2}.first # => [1, 2]
    {:a => true, :b => false}.first # => [:a, true]
    h = Hash.new
    h[:m] = "n"
    h[:o] = "p"
    h.first # => [:m, "n"]
    

    【讨论】:

    • 这很有意义!非常感谢!
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2011-05-01
    • 2018-12-28
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    相关资源
    最近更新 更多