🖋️
JavaScript のデフォルト引数とキーワード引数を Julia と Python と比較する
要約
言語 | 定義 | 呼び出し |
---|---|---|
Julia | f(x, y=2; a, b="b") |
f(x, a=a) |
Python | f(x, y=2, *, a, b="b") |
f(x, a=a) |
JavaScript | f(x, y = 2, { a, b = "b" }) |
f(x, undefined, { a: a }) |
動機
一番詳しいプログラミング言語は Julia なのだが、Python や JavaScript を触っているとどうなっているのかよく分からないのでいつでも思い出せるようにメモする。
言語別の説明
Julia
オプション引数 (optinoal argument) とキーワード引数 (keyword argument) という。
Julia
function f(x, y=2; a, b="b")
println("$x + $y = $a + $b")
end
f(1, a="a") # 1 + 2 = a + b
キーワードで渡すにはキーワード引数でなければならない。
Julia
g(x, y=2) = x + y
g(x=1, y=2) # ERROR: MethodError: no method matching g(; x::Int64, y::Int64)
Python
デフォルト引数 (default argument) と キーワードだけの引数 (keyword-only argument) という。
Python
def f(x, y=2, *, a, b="b"):
print(f"{x} + {y} = {a} + {b}")
f(1, a="a") # 1 + 2 = a + b
通常の引数もキーワードで渡せる。
Python
def g(x, y=2):
return x + y
g(x=1, y=2) # 3
渡せないようにするには /
の前に引数を置いて
Python
def g(x, y=2, /):
return x + y
g(x=1, y=2) # TypeError: g() got some positional-only arguments passed as keyword arguments: 'x, y'
とする必要がある。
JavaScript
JavaScript にキーワード引数はなく、位置引数しかない。代わりに解体代入 (destructing assignment) を使った引数を使う。位置は合うように undefined
で埋める。
JavaScript
function f(x, y = 2, { a, b = "b" }) {
console.log(`${x} + ${y} = ${a} + ${b}`);
}
f(1, undefined, { a: "a" }); // 1 + 2 = a + b
f()
は呼び出せそうに見えて呼び出せない。呼び出せるようにするには
JavaScript
function f(x, y = 2, { a, b = "b" } = {}) {
console.log(`${x} + ${y} = ${a} + ${b}`);
}
f(); // undefined + 2 = undefined + b
とする。通常の引数もキーワードで渡せる。
JavaScript
function g(x, y = 2) {
return x + y;
}
g(x = 1, y = 2); // 3
Discussion