将Ruby数组元素传递给方法

时间:2017-02-26 10:07:18

标签: arrays ruby chef

我不是程序员,但我发现自己写了一些简单的红宝石,并且不确定几件事。

我有以下功能

def resolve_name(ns_name)
  ip = Resolv.getaddress(ns_name)
  return ip
end

和数组

array = ['ns-1.me.com', 'ns-2.me.com']

我想要做的是将数组中的每个元素传递给要评估的函数,并吐出......某事。可能是变量。一旦我有解析的IP,我将把它们传递给erb模板。当可能有1到4个可能的结果时,还不太确定如何处理。

我想要的是我需要做的是做一个each.do和类型转换为字符串到我的函数,但我还没有弄清楚如何实际做到这一点或短语我的问题正确谷歌告诉我

http://ruby-doc.org/core-2.0.0/doc/syntax/calling_methods_rdoc.html#label-Array+to+Arguments+Conversion没有我想要的东西。

irb(main):010:0> resolved = resolve_name(array)
TypeError: no implicit conversion of Array into String

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

查看ruby' Enumerable的文档,这些文档是实现的。您正在寻找的是map方法,该方法获取可枚举(即数组)的每个元素并将其传递给块,返回带有块结果的新数组。像这样:

array.map{|element| resolve_name(element) }

顺便说一下,在你的方法中,你不需要使用局部变量,如果你所做的就是返回它的值;并且return语句是可选的 - ruby​​方法总是返回最后执行的语句的结果。所以你的方法可以缩短到这个:

def resolve_name(ns_name)
  Resolv.getaddress(ns_name)
end

然后你真正做的就是将方法调用包装在另一个方法中。最后,您可以这样做(将array重命名为ns_names以使其不言自明):

ns_names = ['ns-1.me.com', 'ns-2.me.com']
ip_addresses = ns_names.map{|name| Resolv.getaddress(name) }

现在ip_addresses是您可以在模板中使用的IP地址数组。

答案 1 :(得分:0)

如果您传递数组,则可以执行以下操作:

def resolve_name(ns_name)
  res = []
  ns_name.each do |n|
    res << {name: n, ip:  Resolv.getaddress(name) } 
  end   
  res
end

获取一系列哈希值,以便知道哪个地址有哪个ip