diff --git a/lib/ipaddress/ipv4.rb b/lib/ipaddress/ipv4.rb index 500531aa9e215ccfacad3e26426c894c58b2ea95..7d8e0d377e9a08ec973bd478b3d6ee56dce96d91 100644 --- a/lib/ipaddress/ipv4.rb +++ b/lib/ipaddress/ipv4.rb @@ -286,6 +286,21 @@ module IPAddress; @octets[index] end alias_method :octet, :[] + + # + # Updated the octet specified at index + # + # ip = IPAddress("172.16.100.50/24") + # ip[2] = 200 + # + # #=> #<IPAddress::IPv4:0x00000000000000 @address="172.16.200.1", + # #=> @prefix=32, @octets=[172, 16, 200, 1], @u32=2886780929> + # + def []=(index, value) + @octets[index] = value.to_i + initialize("#{@octets.join('.')}/#{prefix}") + end + alias_method :octet=, :[]= # # Returns the address portion of an IP in binary format, diff --git a/test/ipaddress/ipv4_test.rb b/test/ipaddress/ipv4_test.rb index 9f92c944150cc8962d1994365a440ac921d3baeb..19264e22c957ee6d072c97b6dc47d659ee84563a 100644 --- a/test/ipaddress/ipv4_test.rb +++ b/test/ipaddress/ipv4_test.rb @@ -581,6 +581,20 @@ class IPv4Test < Minitest::Test end end + def test_octect_updates + ip = @klass.new("10.0.1.15/32") + ip[1] = 15 + assert_equal "10.15.1.15/32", ip.to_string + + ip = @klass.new("172.16.100.1") + ip[3] = 200 + assert_equal "172.16.100.200/32", ip.to_string + + ip = @klass.new("192.168.199.0/24") + ip[2] = 200 + assert_equal "192.168.200.0/24", ip.to_string + end + end # class IPv4Test