小编Pos*_*elf的帖子

响应式语句的执行顺序是什么?

假设我们有以下组件脚本

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。切换反应语句的顺序没有任何效果。

如何使日志记录语句在另一个语句之前执行?它首先运行第二个的原因是什么?

timing reactive-programming svelte

3
推荐指数
1
解决办法
639
查看次数

断言中的折叠表达式在某些机器上编译,但在其他机器上则不编译

我有以下代码(用于演示目的)应该声明所有参数使用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)

c++ g++ clang++ fold-expression c++17

2
推荐指数
1
解决办法
67
查看次数

使Clojure让语句更具功能性

在我的第一个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也不是函数的工作,而只是任务的一部分.

functional-programming clojure purely-functional

2
推荐指数
1
解决办法
159
查看次数

是"!" intsead"== 0"来检查int是0是好的做法吗?

假设我们有一个变量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 会发生什么?

c++ type-conversion implicit-conversion

0
推荐指数
1
解决办法
76
查看次数