class Calculator
def initialize(arr)
@arr = arr
end
def add; binary(:+); end
def subtract; binary(:-); end
def multiply; binary(:*); end
def divide; binary(:/); end
def power; binary(:**); end
def modulo; binary(:%); end
# ... (others)
def negate; unary(:[email protected]); end
def odd?; unary(:odd?); end
def even?; unary(:even?); end
def to_f; unary(:to_f); end
# ... (others)
private
def binary(op)
raise ArgumentError, 'Too few elements' if @arr.length < 2
@arr.pop.send(op, @arr.pop)
end
def unary(op)
raise ArgumentError, 'Too few elements' if @arr.length.zero?
@arr.pop.send(op)
end
end
# add neg mod pow div mult sub add
calc = Calculator.new [ 1, 5, 2,3, 4,5, 6,7, 8,9, 10,11, 12,13]
#=> #<Calculator:0x007fa192030968 @arr=[1, 5, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]>
calc.add #=> 25 (13+12)
calc.subtract #=> 1 (11-10)
calc.multiply #=> 72 (8*9)
calc.divide #=> 1 (7/6)
calc.power #=> 625 (5**4)
calc.modulo #=> 1 (3%2)
calc.negate #=> -5 (5)
calc.add #=> ArgumentError: Too few elements
Es scheint, dass Sie ein RPN-Rechner bauen. Wenn dies der Fall ist, möchten Sie wahrscheinlich das Ergebnis jeder Berechnung zurück auf den Stapel schieben. Für binäre Operatoren können Sie die Methode ändern binary
wie folgt:
def binary(op)
raise ArgumentError, 'Too few elements' if @arr.length < 2
@arr << @arr.pop.send(op, @arr.pop)
@arr[-1]
end
@arr[-1]
, das Ergebnis der Berechnung ist der Rückgabewert. Die Modifikation von unary
ist ähnlich.
Vielleicht möchten einige Stapelmanipulationsmethoden wie
def pop
@arr.pop
end
def push(n)
@arr << n
end
def swap
@arr[-1], @arr[-2] = @arr[-2], @arr[-1]
end
def rotate
@arr.rotate
end
schließlich hinzuzufügen, können Sie es finden, es klarer den Anfang zu machen (statt Ende) @arr
die Spitze des Stapels, in denen Sie würden unshift/shift
statt push/pop
verwenden.
Was passiert bei einer unären oder n-fachen Operation? : < – user2864740