gpt4 book ai didi

ruby - 意外的哈希行为

转载 作者:数据小太阳 更新时间:2023-10-29 08:09:33 25 4
gpt4 key购买 nike

我是新手。请帮帮我。我写 Puppet 函数一段代码:

    n_if={}
over_if = arguments[1]

over_if.each do |kk,vv|
weth={}
puts kk,vv,weth
weth = arguments[0]
weth['in_vlan'] = vv['in_vlan']
weth['options']['MTU'] = vv['mtu']
n_if['eth'+ kk.to_s]=weth
end

从2个文件中读取数据,分别传入arguments[0]和arguments[1]:

# template of ethernet interfaces
eth_:
method: "static"
family: "inet"
ip: ""
netmask: "255.255.0.0"
onboot: true
options:
MTU: ""
in_vlan: ""

# values for include into ethernet interfaces
eth_values:
0:
mtu: 1500
in_vlan: 15
1:
mtu: 9000
in_vlan: 125

我希望得到带有键“eth0”和“eth1”的散列,如下所示:

eth1methodstaticfamilyinetin_vlan125ipnetmask255.255.0.0onboottrueoptionsMTU9000eth0methodstaticfamilyinetin_vlan15ipnetmask255.255.0.0onboottrueoptionsMTU1500

但是我得到:

eth1methodstaticfamilyinetin_vlan125ipnetmask255.255.0.0onboottrueoptionsMTU9000eth0methodstaticfamilyinetin_vlan125ipnetmask255.255.0.0onboottrueoptionsMTU9000

我的错误是什么?

最佳答案

首先,一些评论:

  1. 您的代码没有像大多数其他人那样缩进,这使得其他人很难帮助您。它应该看起来像这样:

    n_if={}
    over_if = arguments[1]

    over_if.each do |kk,vv|
    weth={}
    puts kk,vv,weth
    weth = arguments[0]
    weth['in_vlan'] = vv['in_vlan']
    weth['options']['MTU'] = vv['mtu']
    n_if['eth'+ kk.to_s]=weth
    end
  2. 也许您的变量名对您有意义,但对我来说却没有意义。什么是 n_ifwethover_ifkkvv

  3. 您将 weth 指定为您的 each 中的散列,然后将其指定为其他内容。你到底想做什么?

  4. 你说arguments[0]arguments[1]是从文件中读入的数据。这些是如何读入的?这些是 YAML 文件吗?如果您包含实际重现您的问题的代码,将会很有帮助。精简到最基本的部分。

  5. 在 Ruby 中,通常不连接字符串而是使用字符串插值更为惯用和高效:

    n_if["eth#{kk}"] = weth

现在,一些答案:

我的猜测是您的设置包含这样的数据:

arguments = {
"eth_"=>{
"method"=>"static",
"family"=>"inet",
"ip"=>"",
"netmask"=>"255.255.0.0",
"onboot"=>true,
"options"=>{"MTU"=>""},
"in_vlan"=>""
},
"eth_values"=>{
0=>{"mtu"=>1500, "in_vlan"=>15},
1=>{"mtu"=>9000, "in_vlan"=>125}
}
}

arguments[0] = arguments['eth_']
arguments[1] = arguments['eth_values']

我相信(基于对您拥有的东西和您可能想要的东西的许多猜测)您的问题是这种组合:

weth={}
weth=arguments[0]

我认为您的意图是说weth 是一种散列类型的对象;现在用arguments[0] 中的值填充它”。这些行实际上说的是:

  • weth 设置为空散列。
  • 没关系,扔掉那个空哈希并将 weth 设置为与 arguments[0] 相同的对象

因此,每次通过循环,您都在使用weth 修改相同 哈希。相反,我认为你想要 duplicate the hash对于 weth。以下修改后的代码是否能满足您的需求?

n_if={}
over_if = arguments[1]

over_if.each do |kk,vv|
weth = arguments[0].dup
weth['in_vlan'] = vv['in_vlan']
weth['options']['MTU'] = vv['mtu']
n_if["eth#{kk}"]=weth
end

require 'pp' # for nice wrapping inspection
pp n_if
#=> {"eth0"=>
#=> {"method"=>"static",
#=> "family"=>"inet",
#=> "ip"=>"",
#=> "netmask"=>"255.255.0.0",
#=> "onboot"=>true,
#=> "options"=>{"MTU"=>9000},
#=> "in_vlan"=>15},
#=> "eth1"=>
#=> {"method"=>"static",
#=> "family"=>"inet",
#=> "ip"=>"",
#=> "netmask"=>"255.255.0.0",
#=> "onboot"=>true,
#=> "options"=>{"MTU"=>9000},
#=> "in_vlan"=>125}}

如果没有,请编辑您的问题,详细说明您实际拥有的内容(提示:p 参数 并向我们展示结果)以及您真正想要的结果。


编辑:为了好玩,这里改为进行函数转换。它留给读者作为练习,以了解它的工作原理并提高他们的函数式编程技能。请注意,我修改了 eth_values 以匹配模板的层次结构,以便可以应用简单的合并。我留下了 "MTU"=>"""in_vlan"=>"" 条目,但请注意它们不是代码工作所必需的,您可以删除两者(以及生成的 "options"=>{})并获得相同的结果。

args = {
"eth_"=>{
"method"=>"static",
"family"=>"inet",
"ip"=>"",
"netmask"=>"255.255.0.0",
"onboot"=>true,
"options"=>{"MTU"=>""},
"in_vlan"=>""
},
"eth_values"=>{
0=>{"options"=>{"MTU"=>1500}, "in_vlan"=>15},
1=>{"options"=>{"MTU"=>9000}, "in_vlan"=>125}
}
}

n_if = Hash[
args['eth_values'].map do |num,values|
[ "eth#{num}",
args['eth_'].merge(values) do |k,v1,v2|
if v1.is_a?(Hash) and v2.is_a?(Hash) then
v1.merge(v2)
else
v2
end
end ]
end
]

pp n_if #=> Same result as in the previous code.

关于ruby - 意外的哈希行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15616218/

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