2020-05-13

デフォルト引数はいつ評価されているのか

デフォルト引数は

def my_method(hoge = "hoge")
  puts hoge
end

みたいなやつで、誰でも一度は書いたことがあるかと思うのですが
このデフォルト引数に変数を指定していた場合はいつ評価されているのか、そう言えばちゃんと確認したことなくて曖昧だったので確認してみたメモ
(変数をデフォルト引数にしているのをそもそもあまり見ない気がする)

[1] pry(main)> @hoge = "hoge"
[2] pry(main)> def my_method(arg = @hoge)
[2] pry(main)*   puts arg
[2] pry(main)* end
[3] pry(main)> my_method
    hoge
[4] pry(main)> @hoge = "changed hoge!"
[5] pry(main)> my_method
    changed hoge!

ということで、Rubyにおいてはメソッドが定義された時ではなく、呼び出し時に評価されている模様

じゃーJSではどうなっているのか

let fuga = 123

const hoge = (arg = fuga) => {
  console.log(arg)
}

hoge() // => 123

fuga = 999

hoge() // => 999

ということでJSも同じく、呼び出し時に評価されているらしい