5 Stimmen

Ruby: Zusammenfassbare Funktionen mit Argumenten

Ich möchte eine Funktion, die den lokalen Zustand in Ruby beibehält. Jedes Mal, wenn ich die Funktion aufrufe, möchte ich ein Ergebnis zurückgeben, das sowohl von einem aufrufenden Argument als auch von dem gespeicherten Zustand der Funktion abhängt. Hier ist ein einfaches Beispiel:

def inc_mult(factor)
  @state ||= 0   # initialize the state the first time.
  @state += 1    # adjust the internal state.
  factor * @state
end

Beachten Sie, dass der Zustand beim ersten Mal initialisiert wird, aber nachfolgende Aufrufe auf den gespeicherten Zustand zugreifen. Dies ist gut, außer dass @state auf den umgebenden Kontext übergreift, was ich nicht möchte.

Wie lässt sich dies am elegantesten umschreiben, so dass @state nicht ausläuft?

(Anmerkung: Mein eigentliches Beispiel ist viel komplizierter, und die Initialisierung des Zustandes ist teuer.)

0voto

botp Punkte 21

Können Sie lambda verwenden. z. B,

$ cat test.rb

def mk_lambda( init = 0 )
  state = init
  ->(factor=1, incr=nil){ 
    state += incr || 1;
    puts "state now is: #{state}"
    factor * state
  }
end

f = mk_lambda

p f[]
p f[1]
p f[2]
p f[100]
p f[100,50]
p f[100]

$ ruby test.rb

state now is: 1
1
state now is: 2
2
state now is: 3
6
state now is: 4
400
state now is: 54
5400
state now is: 55
5500

Mit freundlichen Grüßen -botp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X