master
 1class List
 2  attr_reader :next, :data
 3
 4  def initialize(data)
 5    @data = data
 6  end
 7
 8  def add(data)
 9    if self.next
10      self.next.add(data)
11    else
12      @next = self.class.new(data)
13    end
14  end
15
16  def search(&block)
17    return self if block.call(data)
18
19    @next&.search(&block)
20  end
21end
22
23class MHash
24  def initialize(size = 13)
25    @size = size
26    @buckets = Array.new(size)
27  end
28
29  def [](key)
30    bucket = bucket_for(key)
31    node = @buckets[bucket]
32    return if node.nil?
33
34    found = node.search do |item|
35      item[0] == key
36    end
37    return found.data[-1] if found
38  end
39
40  def []=(key, value)
41    bucket = bucket_for(key)
42    if @buckets[bucket]
43      @buckets[bucket].add([key, value])
44    else
45      @buckets[bucket] = List.new([key, value])
46    end
47  end
48
49  private
50
51  def bucket_for(key)
52    key % @size
53  end
54end
55
56h = MHash.new
57h[8] = 'hello'
58h[21] = 'jello'
59
60puts [8, h[8]].inspect
61puts [21, h[21]].inspect