How about this?
class Calc
attr_accessor :result, :last_operator
def initialize(result=0)
@result = result
end
OPERATORS = {
:plus => :+, :minus => :-, :times => :*, :divided_by => :/
}
OPERANDS = [ :zero, :one, :two, :three, :four, :five, :six, :seven, :eight, :nine, :ten, :eleven, :twelve ]
def method_missing(m, *args, &block)
if OPERATORS.include?(m.to_sym)
@last_operator = m.to_sym
return self
elsif OPERANDS.include?(m.to_sym)
if @last_operator.nil?
@result = OPERANDS.index(m.to_sym)
return self
end
@result = eval("#{@result} #{OPERATORS[@last_operator]} #{OPERANDS.index(m.to_sym)}")
return @last_operator.nil? ? self : @result
end
super
end
end
[20] pry(main)> Calc.new.three.times.seven
=> 21
[21] pry(main)> Calc.new.twelve.divided_by.two
=> 6
source
share