2017-02-26 55 views
1

我不是程序员,但是我发现自己写了一些简单的ruby,并且不确定几件事情。将Ruby数组元素传递给方法

我有以下功能

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和typecast串入我的函数,但我一直无法弄清楚如何真正做到这一点或短语我的问题正确的谷歌告诉我。

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 

有什么建议吗?

回答

5

查看ruby的Enumerable的文档,该文档实现了数组。你要找的是map方法,该方法将可枚举的每个元素(即一个数组)传递给一个块,并返回一个包含块结果的新数组。就像这样:

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

顺便说一句,在你的方法,你并不需要在所有你用它做的是恢复其值设置为使用局部变量;并且返回语句是可选的 - 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的数组地址,你可以在你的模板中使用。

0

如果你传递一个数组,你可以这样做:

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

所以你知道哪些地址的IP

获得哈希值的数组