以下代码无法正常运行:
const spellBtn = document.querySelector('.spell-btn');
const spellTextBox = document.querySelector('#spell-text');
let test = document.querySelector('.test');
const data = [
{"spell": "Aberto" },
{ "spell": "Accio" },
{ "spell": "Age Line" },
{ "spell": "Aguamenti" }
];
function generateSpellBody(data) {
let text = 'not a spell';
for (let i = 0; i < data.length; i++) {
if (data[i].spell === spellTextBox.value) {
text = data[i].spell;
break;
}
}
test.innerHTML = text;
}
spellBtn.addEventListener('click', (e) => {
e.preventDefault();
generateSpellBody(data);
});
我希望它能输出
<form method='get'>
<div class="form-group">
<input type="text" class="form-control" id="spell-text" placeholder="Enter spell">
</div>
<button type="submit" class="spell-btn btn btn-default btn-light">Do spell</button>
</form>
<div class="test"></div>
但是只能打印
let debug_flag = ref false
let dprintf = let open Printf in
match !debug_flag with
| true -> printf
| false -> ifprintf stdout
let test_dprintf () =
begin
debug_flag := true;
Printf.printf "print1\n";
dprintf "print2\n";
Printf.printf "print3\n";
debug_flag := false
end
在print1
print2
print3
中将print1
print3
分配给true
似乎根本没有任何影响。
有人知道为什么吗?如果是这样,您知道一种可行的解决方法吗?
我正在使用OCaml 4.09.0
感谢您的回答
答案 0 :(得分:2)
dprintf
的定义不是函数表达式。它是一个将返回函数的表达式,但是仅在评估dprintf
的定义时才会对表达式本身进行评估,而不是在调用它返回的函数时对其进行评估。
要解决此问题,您只需将参数明确:
let dprintf fmt = let open Printf in
match !debug_flag with
| true -> printf fmt
| false -> ifprintf stdout fmt
现在dprintf
的主体将在调用时进行评估。