Arrays 如何使用IP地址模式填充阵列

Arrays 如何使用IP地址模式填充阵列,arrays,ruby,Arrays,Ruby,我不是程序员,但我发现自己在写一些简单的Ruby。我需要用IP地址列表10.13.203.3、10.13.204.3等填充数组 我知道我可以将一个范围扩展成这样的数组,但如何将其转换成我的IP地址模式呢 a =* (3..10) #=> [3, 4, 5, 6, 7, 8, 9, 10] 我想我需要做字符串插值,然后以某种方式将其反馈到另一个数组中。但是我真的不确定,也不能正确地用谷歌搜索,因为这感觉像是一件很平常的事情。(203..210)。inject([]){ar,I | ar(2

我不是程序员,但我发现自己在写一些简单的Ruby。我需要用IP地址列表10.13.203.3、10.13.204.3等填充数组

我知道我可以将一个范围扩展成这样的数组,但如何将其转换成我的IP地址模式呢

a =* (3..10)
#=> [3, 4, 5, 6, 7, 8, 9, 10]

我想我需要做字符串插值,然后以某种方式将其反馈到另一个数组中。但是我真的不确定,也不能正确地用谷歌搜索,因为这感觉像是一件很平常的事情。

(203..210)。inject([]){ar,I | ar
(203..210)。inject([]){ar,I | ar你可以使用
IPAddr
类,特别是方法

(203..210).inject([]) { |ar, i| ar << "10.13.#{i}.3" }
# [
#   "10.13.203.3",
#   "10.13.204.3",
#   "10.13.205.3",
#   "10.13.206.3",
#   "10.13.207.3",
#   "10.13.208.3",
#   "10.13.209.3"
#   "10.13.210.3"
# ]
我已经编写了一个方法来获取三个参数,第一个IP、下一个IP和要生成的IP总数,同时保持第一个和第二个IP之间的差异

require 'ipaddr'

def gen_ips(ip_start, ip_next, number)     
  ips, ipn = [ip_start, ip_next].map { |ip| IPAddr.new(ip) }
  (ips..IPAddr.new("255.255.255.255")).
    step(ipn.to_i-ips.to_i).
    lazy.
    map { |ip| ip.to_s }.first(number)
end

gen_ips("10.13.203.3", "10.13.204.3", 6)
  # => ["10.13.203.3", "10.13.204.3", "10.13.205.3", "10.13.206.3",
  #     "10.13.207.3", "10.13.208.3"] 
gen_ips("10.13.254.250", "10.13.254.252", 6)
  #=> ["10.13.254.250", "10.13.254.252", "10.13.254.254", "10.13.255.0",
  #    "10.13.255.2", "10.13.255.4"]
第二个示例显示了下一个IP在前一个组中滚动一个数字时发生的情况


我曾经将枚举数转换为惰性枚举数,因此在计算映射元素的
number
后,将立即调用
first(number)
(而不是等到枚举数生成范围内的最后一个
IPAddr('255.255.255.255')
).

您可以使用
IPAddr
类,特别是方法

我已经编写了一个方法来获取三个参数,第一个IP、下一个IP和要生成的IP总数,同时保持第一个和第二个IP之间的差异

require 'ipaddr'

def gen_ips(ip_start, ip_next, number)     
  ips, ipn = [ip_start, ip_next].map { |ip| IPAddr.new(ip) }
  (ips..IPAddr.new("255.255.255.255")).
    step(ipn.to_i-ips.to_i).
    lazy.
    map { |ip| ip.to_s }.first(number)
end

gen_ips("10.13.203.3", "10.13.204.3", 6)
  # => ["10.13.203.3", "10.13.204.3", "10.13.205.3", "10.13.206.3",
  #     "10.13.207.3", "10.13.208.3"] 
gen_ips("10.13.254.250", "10.13.254.252", 6)
  #=> ["10.13.254.250", "10.13.254.252", "10.13.254.254", "10.13.255.0",
  #    "10.13.255.2", "10.13.255.4"]
第二个示例显示了下一个IP在前一个组中滚动一个数字时发生的情况

我曾经将枚举数转换为惰性枚举数,因此在计算映射元素的
number
后,将立即调用
first(number)
(而不是等到枚举数生成范围内的最后一个
IPAddr('255.255.255.255')
) 范围是
可枚举的
,因此您可以对其调用
map
。而且它更简单、更容易理解:

(203..210).map { |i| "10.13.#{i}.3" }
将给你:

#=> ["10.13.203.3", "10.13.204.3", "10.13.205.3", "10.13.206.3", "10.13.207.3", "10.13.208.3", "10.13.209.3", "10.13.210.3"]
你在找什么 范围是
可枚举的
,因此您可以对其调用
map
。而且它更简单、更容易理解:

(203..210).map { |i| "10.13.#{i}.3" }
将给你:

#=> ["10.13.203.3", "10.13.204.3", "10.13.205.3", "10.13.206.3", "10.13.207.3", "10.13.208.3", "10.13.209.3", "10.13.210.3"]


太好了。谢谢。我真的不知道它是如何工作的,但我不需要。@Brando_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuo,我想是的。我希望你能明白。
(203..210)
是一个值的范围,你可以迭代,把它传递到
{I}
。你也可以使用数组而不是范围(如果出于某种原因,你不需要所有的consequentive元素):
[203,204,206,253].inject([]){ar,i | ar
inject
在这里工作,但是
每一个带有_对象的
都更可靠,因为你不必链接它。更好的是一个直接的
映射
调用,它的代码要少得多。而
inject
是通用的,可以做循环所能做的一切(因此,
可枚举
中的所有其他方法都可以执行,包括
映射
每个
选择
分组依据
,…),一般来说,最好使用限制性最强的方法让未来的读者明白语义。在这种情况下,您只需转换元素,即一个简单的
映射
,无需使用
注入
/
的通用性,每个带有对象的\u
完美。谢谢。我不知道“我真的不知道它是如何工作的,但我不需要知道。@Brando_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu{| ar,i | ar
inject
在这里工作,但是
每个带有_对象的
都更可靠,因为你不必链接它。更好的是一个直接的
map
调用,它大大减少了代码。而
inject
是通用的,可以做循环可以做的任何事情(因此,
可枚举
中的所有其他方法都可以执行,包括
映射
每个
选择
分组依据
,…),一般来说,最好使用限制性最强的方法让未来的读者明白语义。在这种情况下,您只需转换元素,即一个简单的
映射
,无需使用
注入
/
的通用性,每个带有对象的\u
。您已经有了一个清晰的想法我们使用的是
IPAddr
,但值得注意的是
IPAddr.new(a)…IPAddr.new(b)
可以工作,支持任意自定义类,因此您可以
。\u a
没有混乱的范围。@tadman,谢谢,我正在进行修订(部分原因是我不认为我回答了所问的问题。)我花了一段时间,因为我对那门课不太熟悉。起初我显然回答了错误的问题。我相应地修改了我的答案。@tadman,你是这样建议的吗?我的想法更像是
(IPAddr.new(ip_start)…IPAddr.new(ip_next)).to_a
这很简单。很容易忽略范围的适应性。因为它可以用于枚举,所以可以对其应用任何可枚举操作,如
first(n)
每个\u片(2)
来提取对或任何东西。唉,这只会返回一个包含给定ip作为输入的两元素数组。您对
IPAddr
有一个很好的想法,但值得注意的是
IPAddr.new(a)…IPAddr.new(b)
可以工作,支持任意自定义类,所以你只需
。\u a
这个范围没有混乱。@tadman,谢谢,我正在进行修订(部分原因是我认为我没有回答被问到的问题。)我花了一段时间,因为我没有