Ruby:隐式散列的规则 [英] Ruby: rules for implicit hashes

查看:111
本文介绍了Ruby:隐式散列的规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么第二个输出只显示 Array 中的一个元素?它还是 Array 还是 Hash 已经?

Why second output shows me only one element of Array? Is it still Array or Hash already?

def printArray(arr)
    arr.each { | j |
        k, v = j.first
        printf("%s %s %s \n", k, v, j)
    }
end

print "Array 1\n"
printArray( [
                {kk: { 'k1' => 'v1' }},
                {kk: { 'k2' => 'v2' }},
                {kk: { 'k3' => 'v3' }},
            ])


print "Array 2\n"
printArray( [
                kk: { 'k1' => 'v1' },
                kk: { 'k2' => 'v2' },
                kk: { 'k3' => 'v3' },
            ])

exit

# Output:
#
# Array 1
# kk {"k1"=>"v1"} {:kk=>{"k1"=>"v1"}} 
# kk {"k2"=>"v2"} {:kk=>{"k2"=>"v2"}} 
# kk {"k3"=>"v3"} {:kk=>{"k3"=>"v3"}} 
# Array 2
# kk {"k3"=>"v3"} {:kk=>{"k3"=>"v3"}}


推荐答案

Ruby将第二个示例解释为具有单个哈希一个它的元素(大括号暗含)。这相当于:

Ruby interpreted the second example as an array with a single hash as its element (the curly braces are implied). It is equivalent to this:

[{ kk: { 'k1' => 'v1' }, kk: { 'k2' => 'v2' }, kk: { 'k3' => 'v3' }}]

只有最后一个'kk'是因为散列不能有重复键;只有最后一个支持。

Only the last 'kk' is shown because hashes can't have duplicate keys; only the last one sticks.

如果您想要一个包含多个哈希值的数组作为元素,您需要使用第一个示例中的语法。

If you want an array with multiple hashes as elements, you need to use the syntax like on your first example.

更多ruby暗示哈希开始的例子:

More examples on which ruby implies a hash start:

# Only argument on method calls
def only_arg(obj)
  puts obj.class
end

only_arg(bar: "baz")  # => Hash

# Which is equivalent to:
only_arg({bar: "baz"}) # => Hash


# Last argument on method calls
def last_arg(ignored, obj)
  puts obj.class
end

last_arg("ignored", bar: "baz") # => Hash

# Which is equivalent to:
last_arg("ignored", { bar: "baz" }) # => Hash


# Last element on an array
def last_on_array(arr)
  puts arr.last.class
end

last_on_array(["something", "something", bar: "baz"]) # => Hash

# Which is equivalent to:
last_on_array(["something", "something", { bar: "baz" }]) # => Hash

这篇关于Ruby:隐式散列的规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆