Functional
default: 引数は呼び出し前に評価され、supplier は必要時まで遅延できる
既定値を値として渡す呼び出しではその式が先に評価され、関数として渡せば必要な時だけ計算できます。
SourcefallbackEvaluation.ts
Node.js 22
export function eagerDefault<T>(value: T | undefined, fallback: T): T {
return value ?? fallback;
}
export function lazyDefault<T>(value: T | undefined, fallback: () => T): T {
return value ?? fallback();
}TestfallbackEvaluation.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { eagerDefault, lazyDefault } from "../../src/nullable/fallbackEvaluation.js";
test("値があってもeagerな既定値の式は評価される", () => {
let eagerCalls = 0;
const eagerFallback = () => { eagerCalls += 1; return "guest"; };
assert.equal(eagerDefault("member", eagerFallback()), "member");
assert.equal(eagerCalls, 1);
let lazyCalls = 0;
assert.equal(lazyDefault("member", () => { lazyCalls += 1; return "guest"; }), "member");
assert.equal(lazyCalls, 0);
});01Assertion
このテストで確認できること
- eager な既定値の式は値がある場合にも評価される
- supplier は値がある場合に呼ばれない
高コストな既定値、I/O、乱数を使う既定値は supplier として渡します。呼び出し規約の違いを名前で示すことも重要です。
OBSERVED RESULT
expected: eager fallback calls → 1
actual: 1
expected: lazy fallback calls → 0