g()が二回呼び出されています。それも、f()を呼び出した直後にです。そう、Rubyで引数のデフォルトを書いた場合、(引数が指定されていなければ)関数呼び出しの時点で評価されます1。そして、その評価値がデフォルトの値として使われます。注意してなければならないのは、関数呼び出しが行われる度に、そのデフォルトが使われるのであれば、式が評価されると言うことです。そしてこの式をデフォルト式といいます。デフォルトになるのは、あくまで式であり、前回の結果がどのような値であったとしても、毎回評価された後の値が使われます2。評価されるタイミングは、関数呼び出しの時であり、関数定義時に一切評価されることはありません。また、引数が指定され、デフォルト式が使われない場合は、その式の評価自体がなされません。 デフォルト値 vs デフォルト式 ということで、似ているとか、パクリだとか、そんなことを言われている言語間