Kalkulator - nie rozumiem zasady działania tego przykładu

Bawię w Shoes i tak oto znalazłem przykład kalkulatora:

    class Calc
  def initialize
    @number = 0
    @previous = nil
    @op = nil
  end

  def to_s
    @number.to_s
  end
  
  (0..9).each do |n|
    define_method "press_#{n}" do
      @number = @number.to_i * 10 + n
    end
  end

  def press_clear
    @number = 0
  end

  {'add' => '+', 'sub' => '-', 'times' => '*', 'div' => '/'}.each do |meth, op|
    define_method "press_#{meth}" do
      if @op
        press_equals
      end
      @op = op
      @previous, @number = @number, nil
    end
  end

  def press_equals
    @number = @previous.send(@op, @number.to_i)
    @op = nil
  end

end

number_field = nil
number = Calc.new
Shoes.app :height => 250, :width => 200, :resizable => false do
  background "#EEC".."#996", :curve => 5, :margin => 2

  stack :margin => 2 do

    stack :margin => 8 do
      number_field = para strong(number)
    end

    flow :width => 218, :margin => 4 do
      %w(7 8 9 / 4 5 6 * 1 2 3 - 0 Clr = +).each do |btn|
        button btn, :width => 46, :height => 46 do
          method = case btn
            when /[0-9]/; 'press_'+btn
            when 'Clr'; 'press_clear'
            when '='; 'press_equals'
            when '+'; 'press_add'
            when '-'; 'press_sub'
            when '*'; 'press_times'
            when '/'; 'press_div'
          end
          
          number.send(method)
          number_field.replace strong(number)
        end
      end
    end
  end

end

W sumie te linijki z stricte z Shoes są oczywiste. Problem mam natomiast z klasą Calc - jak na to patrzę, to za Chiny Ludowe nie mam pojęcia, w jaki sposób to wykonuje działania matematyczne. Czy mogę prosić o wskazówkę?

Calc definiuje metody press_0, press_1 … press_9, które biorą dotychczasową wartość w pamięci (@number), mnożą przez 10 i dodają do niej 0,1…9, tak jak na kalkulatorze.
Poza tym definiowane są metody press_add, press_sub itd. Trzeba pamiętac o tym, że wklepywanie na kalkulator polega na

  1. wklepaniu pierwszej liczby, zapaimętanie jej
  2. wklepanie operacji, zapamiętanie jej
  3. wklepanie drugiej liczby, zapamiętanie

gdy zrobisz to i znowu klikniesz np press_equals, to na pierwszej liczbie wykonywana jest operacja z argumentem drugiej liczby. podobnie się dzieje przy naciśnięciu press_add itd.

No tworzenie metod rozumiem, jest w miarę oczywiste.

Czyli cały mój problem rozchodził się o to, że nie wiedziałem do końca, jak w tym przypadku działa metoda .send:

@previous.send(@op, @number.to_i)

Dziękuję bardzo : -)
W powyższym chodzi o to, że na liczbie @previous wykonuje metodę @op z parametrem @number, prawda?

zgadza się, np. 1.send("+",2)