[前][次][番号順一覧][スレッド一覧]

ruby-changes:12673

From: knu <ko1@a...>
Date: Tue, 4 Aug 2009 15:13:00 +0900 (JST)
Subject: [ruby-changes:12673] Ruby:r24388 (trunk): * lib/ipaddr.rb (IPAddr#{eql?,hash}): Add IPAddr#{eql?,hash} so

knu	2009-08-04 15:10:42 +0900 (Tue, 04 Aug 2009)

  New Revision: 24388

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24388

  Log:
    * lib/ipaddr.rb (IPAddr#{eql?,hash}): Add IPAddr#{eql?,hash} so
      that an IPAddr object can be used as a hash key, a set element,
      etc.; suggested by Nick Brown <nick@n...>.

  Modified files:
    trunk/ChangeLog
    trunk/lib/ipaddr.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24387)
+++ ChangeLog	(revision 24388)
@@ -1,3 +1,9 @@
+Tue Aug  4 15:06:58 2009  Akinori MUSHA  <knu@i...>
+
+	* lib/ipaddr.rb (IPAddr#{eql?,hash}): Add IPAddr#{eql?,hash} so
+	  that an IPAddr object can be used as a hash key, a set element,
+	  etc.; suggested by Nick Brown <nick@n...>.
+
 Tue Aug  4 13:07:10 2009  NARUSE, Yui  <naruse@r...>
 
 	* include/ruby/oniguruma.h (ONIG_SYN_WARN_CC_DUP): defined.
Index: lib/ipaddr.rb
===================================================================
--- lib/ipaddr.rb	(revision 24387)
+++ lib/ipaddr.rb	(revision 24388)
@@ -331,6 +331,16 @@
   end
   include Comparable
 
+  # Checks equality used by Hash.
+  def eql?(other)
+    return self.class == other.class && self.hash == other.hash && self == other
+  end
+
+  # Returns a hash value used by Hash, Set, and Array classes
+  def hash
+    return (@addr.hash << 1) | (ipv4? ? 0 : 1)
+  end
+
   # Creates a Range object for the network address.
   def to_range
     begin_addr = (@addr & @mask_addr)
@@ -810,4 +820,29 @@
 
   end
 
+  def test_hash
+    a1 = IPAddr.new('192.168.2.0')
+    a2 = IPAddr.new('192.168.2.0')
+    a3 = IPAddr.new('3ffe:505:2::1')
+    a4 = IPAddr.new('3ffe:505:2::1')
+    a5 = IPAddr.new('127.0.0.1')
+    a6 = IPAddr.new('::1')
+
+    h = { a1 => 'ipv4', a2 => 'ipv4', a3 => 'ipv6', a4 => 'ipv6', a5 => 'ipv4', a6 => 'ipv6' }
+    assert_equal(4, h.size)
+    assert_equal('ipv4', h[a1])
+    assert_equal('ipv4', h[a2])
+    assert_equal('ipv6', h[a3])
+    assert_equal('ipv6', h[a4])
+
+    require 'set'
+    s = Set[a1, a2, a3, a4, a5, a6]
+    assert_equal(4, s.size)
+    assert_equal(true, s.include?(a1))
+    assert_equal(true, s.include?(a2))
+    assert_equal(true, s.include?(a3))
+    assert_equal(true, s.include?(a4))
+    assert_equal(true, s.include?(a5))
+    assert_equal(true, s.include?(a6))
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]