ダブルディスパッチ

(2)ここで(しかたなく) @a と @b を attr で公開しましたが、
公開しないでこの eql? と同様なものは作れるでしょうか?

現状では普通にはできません.ちょっとひねれば

  def eql? other
    other.check_eq? @a, @b
  def
  def check_eq? a, b
    a == @a and b == @b
  end

こういうやりかた(まず自分のメソッドで絞り込みやデータの取り
出しを行い,残りは相手のメソッドに任せてしまうようなやりかた)
をダブルディスパッチと呼びます.オブジェクト指向では良く使わ
れるやり方なので覚えておくと便利でしょう.

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1659