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ę?