假设我们有以下组件脚本
let x = 0;
function increase() {
x += 1;
}
$: console.log(x)
$: if (x == 4) {
x = 0;
}
Run Code Online (Sandbox Code Playgroud)
https://svelte.dev/repl/2bca979673114afea9fc6b37434653a3?version=3.29.0
直觉上,我期望持续调用increase, 是将值0,1,2,3,4,1,2,3,4,...记录到控制台。但这种情况并非如此。相反,第二个反应式语句首先运行,并且4从不记录;这是0。切换反应语句的顺序没有任何效果。
如何使日志记录语句在另一个语句之前执行?它首先运行第二个的原因是什么?
我有以下代码(用于演示目的)应该声明所有参数使用C++ 17折叠表达式求值为true.
#include <cassert>
template<typename... Ts>
void fn(Ts... ts)
{
assert(ts && ...);
}
int main()
{
fn(true, true, true);
fn(true, true, false, true);
}
Run Code Online (Sandbox Code Playgroud)
在Coliru,它按预期工作; 它不在我的机器上.我收到了错误
In file included from /usr/include/c++/8.2.1/cassert:44,
from foldexpr.cpp:1:
foldexpr.cpp: In function ‘void fn(Ts ...)’:
foldexpr.cpp:6:15: error: expected ‘)’ before ‘&&’ token
assert(ts && ...);
^~
foldexpr.cpp:6:5: error: expected ‘;’ before ‘)’ token
assert(ts && ...);
^~~~~~
Run Code Online (Sandbox Code Playgroud)
与gcc版本8.2.1 20180831.在Ubuntu与gcc版本5.4.0 20160609我得到
In file included from /usr/include/c++/5/cassert:43:0,
from foldexpr.cpp:1:
foldexpr.cpp: In function ‘void fn(Ts ...)’:
foldexpr.cpp:6:18: error: …Run Code Online (Sandbox Code Playgroud) 在我的第一个Clojure项目中,除了最后这部分外,一切都很顺利:
(let [broken-signs (->> (:symbols field)
(map make-sign)
(filter broken?))
broken-count (count broken-signs)
unfixable-count (-> (filter (complement fixable?) broken-signs)
(count))]
(println
(if (> unfixable-count 0)
-1
(- broken-count unfixable-count))))
Run Code Online (Sandbox Code Playgroud)
缩进看起来很不正常,因为我在let块中重用了state.我基本上计算了破损标志的数量,然后计算了可固定标志的数量.如果任何标志是不可修复的,我打印-1,否则我打印要修复的标志数量.
如果我映射/过滤两次,我会有重复的代码,但最重要的是它运行速度较慢.有没有办法改进这个代码呢?
(defn count-broken-yet-fixable []
(let [broken (->> (:symbols field)
(map make-sign)
(filter broken?))
unfixable (remove fixable? broken)]
(when (empty? unfixable)
(count broken))))
(defn solve-task []
(if-let [result (count-broken-yet-fixable)]
result
-1))
(println (solve-task))
Run Code Online (Sandbox Code Playgroud)
减法确实没有必要,并且计数不必发生在let块中.在错误输入上输出-1也不是函数的工作,而只是任务的一部分.
假设我们有一个变量a:
int a = 0;
Run Code Online (Sandbox Code Playgroud)
可以吗
if(!a)
{
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
代替
if(a == 0)
{
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
?因为它有效.
在第一个例子中,int将变成一个bool,所以没有它可以static_cast<bool>(a)吗?如果a大于1 会发生什么?