1

我正在尝试确定给定 IP 是否在网络阵列中。include?对对象数组使用IPAddr似乎不起作用(从未满足 if 条件),例如:

require 'ipaddr'

my_ipaddr = IPAddr.new("192.168.10.102")

# define our internal networks
internal = [IPAddr.new("192.168.50.1/24"), IPAddr.new("192.168.10.1/24")]

if internal.include?(my_ipaddr)
    puts "I'm in the internal network"
end

但是,如果我定义一个没有数组的单个网络,它会很好地工作:

internal = IPAddr.new("192.168.10.1/24")

如果您需要更多信息,请告诉我。我是红宝石的新手,所以请善待:)。

4

2 回答 2

4

您要求 Ruby 查看数组中的任何对象是否与 IP 地址匹配,但它们不会。IP 网络与主机 IP 不同。

相反,您必须将主机 IP 与单个 IP 范围进行比较,并查看它是否包含在内。

参见include?IPAddr 类:

internal.any? { |i| i.include?(my_ipaddr) }

可枚举的any?返回真/假。用于find获取第一个:

internal.find { |i| i.include?(my_ipaddr) }

如果您正在进行大量 IP 地址操作或子网划分,请查看IPAddress gem。这真的很好。

于 2013-07-01T15:21:11.993 回答
2

该类IPAddr有自己的方法include?,与Array#include?

http://www.ruby-doc.org/stdlib-2.0/libdoc/ipaddr/rdoc/IPAddr.html#method-i-include-3F

当您说internal.include?您实际上是在调用Array#include?which 测试对象相等性时。显然这些不是同一个对象,所以比较失败。

您真正想要的是查看您的对象是否有任何IPAddr对象include?my_ipaddr

if internal.any? {|subnet| subnet.include?(my_ipaddr) }
    puts "I'm in the internal network"
end
于 2013-07-01T15:16:06.083 回答