【问题标题】:Scope and Variable Resolution in Ruby BlocksRuby 块中的范围和变量解析
【发布时间】:2013-08-09 08:07:03
【问题描述】:

我在以下代码中缺少一些东西。

hostnames =  []
ip_addrs  =  []
hw_addrs  =  []

File.open("/etc/dhcp/dhcpd.conf", "r").each_line do |line|

  unless line.match('#')                        # Make sure the line is not commented
    if line.match("host-name")
        hostname = line.scan(/"([^"]*)"/)       # extract the Hostname
    elsif line.match("fixed-address")
        ip_addr = line.scan(/(\S*);/)           # Extract IP addr
    elsif line.match("ethernet")
      hw_addr = line.scan(/(\S*);/)             # Extract the HW address
    end
  end

  hostnames + hostname.to_a if hostname         # Protect against `nil' values
  ip_addrs  + ip_addr.to_a  if ip_addr          #  Same
  hw_addrs  + hw_addr.to_a  if hw_addr          #  Same

end

puts hostnames.inspect                          # Should be a list of hostnames...

这应该使用在dhcpd.conf 文件中找到的值填充数组。 如果我打印 File.open.each_line 块内的值,那么我会得到 STDOUT 的完整列表。当我尝试获取块之外的值时,我得到空数组。

我认为该块会生成我的变量的副本并对其进行处理,但它们不会从块中传回。我不确定内部是如何工作的,只是猜测。

【问题讨论】:

  • 您没有将它添加到主机名数组中。尝试主机名
  • 这是您的代码的精确副本吗?最后一个end 之前的三个语句没有意义。那些应该是任务?

标签: ruby file variables scope


【解决方案1】:

如果你想向数组中添加一些东西,你需要使用正确的运算符:

hostnames += hostname.to_a if hostname

您所做的是创建一个临时结果并将其丢弃:a + b 不是永久修改,但a = a + b 是,其中简写为a += b

通常您使用<< 将单个元素添加到数组中,它避免创建新数组而只是追加到现有数组。例如:

hostnames << hostname if hostname

这通常就足够了。除非您实际上一次附加多个值,否则将所有内容转换为数组只是为了连接它们是浪费的。

【讨论】:

  • 对,我一读到这里就想起来了。谢谢。我知道我错过了一些简单的东西。
【解决方案2】:

hostnames + hostname.to_a 更改为hostnames &lt;&lt; hostname.to_a

在当前版本的代码中,您实际上并未将hostname 添加到hostnames 数组中。 &lt;&lt;hostname 元素推送到hostnames

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 2022-01-17
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多