gpt4 book ai didi

Ruby:使用键/值数组设置新哈希

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:24 26 4
gpt4 key购买 nike

我正在通过 RubyMonk 学习 Ruby。在waiter robot problem的解决方案中,有一行代码使用数组创建新的散列:

o = Hash[*order]

给予

order = [:table, 1, :sandwich, "denver", :drink, "mango shake"]

我了解这里正在做什么以及 splat 运算符的工作原理。但是,我对创建此哈希的语法感到困惑。 RubyDoc::[] 实际上是被调用的方法,所以我能够确定 o = Hash::[](*order) 是同一件事。但为什么可以将其缩短为 Hash[*order]?这是一个由解析器解释的特殊结构,还是有其他原因?同样,为什么以下任何一项都不起作用?

o = Hash.new
o.[](*order)

o = Hash.new
o[*order]

甚至像 o = {}[*order]

我知道这些不应该起作用;我只是不确定为什么。我想我对 Hash[*order] 的用法感到困惑,而没有首先使用 Hash.new 实例化散列。这是类方法和实例方法区别的例子吗?

(作为旁注,在我看来 o = {*order} 应该可以工作,但事实并非如此。)

谁能解释一下这里发生了什么,是否有其他方法可以将数组中的值添加到散列中?

最佳答案

这是类方法和实例方法区别的例子吗?

没错。

但为什么可以将其缩短为 Hash[*order]

Ruby 将 some_object[] 解释为对 some_object 上名为 [] 的方法的调用。这对 Hashes 来说并不特殊,您可以在您自己的任何类中实现 [] 方法并使用该语法。

谁能解释一下这里发生了什么,以及是否有其他方法可以将数组中的值添加到哈希中?

Hash[*order] 调用创建新哈希的类方法 (Hash#[])。 o.[](*order) 不起作用的原因与您不能对其调用 new 的原因相同:{}.new没有任何意义。您不能在类的实例上调用类方法。

您可以使用merge 添加值:

o = Hash.new
o.merge(Hash[*order])

o = {*order} 不起作用,因为 {} 是哈希文字的语法,将 *order 放入没有意义。

Hash(*order)Kernel#Hash ,一种只需要一个参数的方法。

关于Ruby:使用键/值数组设置新哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com