0

次の例のように、有限状態を任意の回数遷移するコードがある場合、

def a
  ...
  case some_condition
  when :foo then a
  when :bar then b
  else           c
  end
end
def b
  ...
  case some_other_condition
  when :baz then  a
  when :bang then b
  else            c
  end
end
def c
  ...
  case still_another_condition
  when :zap then  a
  when :boom then b
  else            c
  end
end
a

新しい状態に遷移するたびに呼び出しスタックが大きくなり、パフォーマンスの問題が発生すると思います。コール スタックの任意の増加を回避する方法はありますか? 末尾再帰の最適化はこれに関連していますか?

4

1 に答える 1

2

私の頭に浮かぶ最初の解決策は、ある種のルーティング方法です。

def routing(call = :a)
  begin
    call = send call
  end until call == :end
end

次に、他のメソッドは、次に呼び出すメソッドの名前を返します。

def a
  ...
  case some_condition
  when foo then :a
  when bar then :b
  else          :c
  end
end

これにより、コール スタックがフラットに保たれます。ルーティング ループをスキップする場合は、:end を返します。

于 2012-09-26T05:57:32.327 に答える