我正在尝试确定给定的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")
如果您需要更多信息,请与我们联系。我是红宝石的新手,所以请善待:)。
答案 0 :(得分:4)
您要求Ruby查看数组中的任何对象是否与IP地址匹配,而不是。 IP网络与主机IP不同。
相反,您必须将主机IP与单个IP范围进行比较,看看它是否包含在内。
请参阅IPAddr类中的include?
:
internal.any? { |i| i.include?(my_ipaddr) }
Enumerable的any?
返回true / false。使用find
代替第一个:
internal.find { |i| i.include?(my_ipaddr) }
如果您正在进行大量IP地址操作或子网划分,请查看IPAddress gem。真的很好。
答案 1 :(得分: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?
来测试对象相等性。显然这些不是同一个对象,因此比较失败。
您真正想要的是查看IPAddr
对象include?
<{1}}对象
my_ipaddr