将Ruby数组元素传递给方法

Bra*_*o__ 1 ruby arrays chef-infra

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

我有以下功能

def resolve_name(ns_name)
  ip = Resolv.getaddress(ns_name)
  return ip
end
Run Code Online (Sandbox Code Playgroud)

和数组

array = ['ns-1.me.com', 'ns-2.me.com']
Run Code Online (Sandbox Code Playgroud)

我想要做的是将数组中的每个元素传递给要评估的函数,并吐出......某事.可能是变量.一旦我有解析的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
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Thi*_*ilo 5

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

array.map{|element| resolve_name(element) }
Run Code Online (Sandbox Code Playgroud)

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

def resolve_name(ns_name)
  Resolv.getaddress(ns_name)
end
Run Code Online (Sandbox Code Playgroud)

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

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

现在ip_addresses是一个可以在模板中使用的IP地址数组.