小编Yib*_*ang的帖子

JavaScript - 什么时候调用堆栈变得"空"?

我在事件循环中读过几个帖子/ SO线程,根据MDN的文章,

当堆栈为空时,将从队列中取出一条消息并进行处理.

作为一个JS新手,我仍然感到困惑的是 - 什么时候调用堆栈变得"空"?例如,

<script>
function f() {
  console.log("foo");
  setTimeout(g, 0);
  console.log("foo again");
}
function g() {
  console.log("bar");
}
function b() {
  console.log("bye");
}

f();
/*<---- Is the stack empty here? */
b();
</script>
Run Code Online (Sandbox Code Playgroud)

正确的执行顺序是foo- foo again- bye- bar.

但是今天我开始思考:退出f()电话后,技术上的堆栈是不是很空?我的意思是在那一点上我们不在任何函数内部,并且我们还没有开始任何新的执行,所以不应该处理setTimeout调用消息(已经立即排队),然后继续执行b(),并给出顺序foo- foo again- bar- bye

如果我们有一百万行代码或一些密集计算要执行并且setTimeout(func, 0)只是在队列中停留多长时间怎么办?

javascript concurrency asynchronous event-loop settimeout

17
推荐指数
1
解决办法
1756
查看次数

Python zip对象在迭代后'消失'?

这里总的菜鸟问题,但我真的想知道答案.

在我尝试以列表形式迭代它之后,我不知道为什么zip对象只是"消失":例如.

>>> A=[1,2,3]
>>> B=['A','B','C']
>>> Z=zip(A,B)
>>> list(Z)
>>> [('C', 3), ('B', 2), ('A', 1)]
>>> {p:q for (p,q) in Z}
{1: 'A', 2: 'B', 3: 'C'}
>>> {p:q for (p,q) in list(Z)}
{}
>>> list(Z)
[]
Run Code Online (Sandbox Code Playgroud)

(这是在Python 3.4.2中)

有人可以帮忙吗?

oop zip list python-3.x

9
推荐指数
2
解决办法
2647
查看次数

C++ 文件 I/O——不能同时读/写?

我正在编写一些简单的代码,该代码应该读取所​​有其他字符,并用随机文本文件中的“?”覆盖它们的相邻字符。例如。test.txt 包含“Hello World”;运行程序后,它会是“H?l?o?W?r?d”

下面的代码允许我从控制台窗口中的文本文件中读取所有其他字符,但是在程序结束后并且当我打开 test.txt 时,没有任何更改。需要帮助找出原因...

#include<iostream>
#include<fstream>
using namespace std;

int main()
{

    fstream data("test.txt", ios::in | ios::out); //here the test.txt can be any random text file
    while (!data.eof())
    {
        if (!data.eof())
        {
            char ch;
            data.get(ch);
            cout << "ch is now " << ch << endl;

        }


        if (!data.eof())
            data.put('?');

    }
    data.close();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ file-io

5
推荐指数
1
解决办法
7304
查看次数

分配给{} .toString意味着什么?

我正在学习JavaScript,我遇到了这个片段,它演示了类型检测:

var toClass = {}.toString // Copy a reference to toString for objects into toClass variable

alert( toClass.call( [1,2] ) ) // [object Array]
alert( toClass.call( new Date ) ) // [object Date]
Run Code Online (Sandbox Code Playgroud)

我不明白第一行中的空花括号是什么,所以我将它们删除如下:

var toClass = toString
Run Code Online (Sandbox Code Playgroud)

代码仍然有效.但是在下面的代码中,

function getAge () {
    alert(this.age);
}

var p1 = {
    age:1
};

var tellAge=getAge;
tellAge.call(p1); //1
Run Code Online (Sandbox Code Playgroud)

如果我var tellAge=getAge改为var tellAge={}.getAge,我得到一个错误:无法读取未定义的属性"调用".为什么是这样?是因为toString是内置功能吗?

javascript function tostring

5
推荐指数
1
解决办法
306
查看次数

如何在Node.js server.listen()中使用可选的hostname参数

从我到目前为止在教程中读到的内容来看,可选hostname参数server.listen(port[, hostname][, backlog][, callback])始终是127.0.0.1(环回),0.0.0.0(监听每个可用的网络接口,默认选项),或者服务器可用的实际IP地址之一.其他一切都会给出一个Error: listen EADDRNOTAVAIL.那是全貌吗?(我相信主机名在技术上与IP不同......)

我无法从文档中找到太多关于它的内容......

ip host node.js server

5
推荐指数
1
解决办法
1万
查看次数

如何在不中断正在运行的作业的情况下终止GNU并行?

我正在运行一堆shell脚本, parallel -a my_scripts bash 并且在某些时候我决定我已经运行了足够多的东西,并希望停止产生新的工作,并简单地让所有现有的工作完成.换句话说,我想杀死父进程而不杀死孩子.

在第一次启动GNU并行时似乎有控制终止的方法(例如,如果我事先知道我只想运行x作业,那么我可以使用--halt now,success=x参数),但是我已经找不到如何控制GNU并行运行.

当然我可以只是CTRL+C杀死并行,并重新运行中止的工作,但我认为可能有一个更聪明的方法.

linux parallel-processing bash process gnu-parallel

5
推荐指数
1
解决办法
1686
查看次数

Python多处理——共享id的单独进程中的全局变量?

这个问题我了解到:

当您使用多处理打开第二个进程时,会创建一个全新的 Python 实例,具有自己的全局状态。该全局状态不共享,因此子进程对全局变量所做的更改对于父进程来说是不可见的。

为了验证这种行为,我制作了一个测试脚本:

import time
import multiprocessing as mp
from multiprocessing import Pool
x = [0]  # global
def worker(c):
    if c == 1:  # wait for proc 2 to finish; is global x overwritten by now?
        time.sleep(2)
    print('enter: x =', x, 'with id', id(x), 'in proc', mp.current_process())
    x[0] = c
    print('exit: x =', x, 'with id', id(x), 'in proc', mp.current_process())
    return x[0]

pool = Pool(processes=2)
x_vals = pool.map(worker, [1, 2])
print('parent: x =', x, 'with …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing multiprocessing python-multiprocessing

4
推荐指数
1
解决办法
2516
查看次数

Haskell:递归地处理嵌套任意深度的列表

我正在学习Haskell,并希望编写函数来递归处理嵌套任意深度的列表.

例如,我想写recurReverse,在基础情况下,就像内置一样reverse,但是当传递一个嵌套列表时,reverse子列表的所有元素也会递归:

recurReverse [1,2]
>> [2,1]
recurReverse [[1],[2],[3,4]]
>> [[4,3],[2],[1]]
recurReverse [[[1,2]]]
>> [[[2,1]]]
Run Code Online (Sandbox Code Playgroud)

目前我有基本的reverse下来:

rev [] = []
rev (h:t) = rev t ++ [h]
Run Code Online (Sandbox Code Playgroud)

但是我需要的不仅仅是这个 - 在头部h也是一个列表的情况下(与LISP意义上的原子相对),我希望能够做到reverse h并返回类似的东西rev t ++ [rev h].当我尝试这个时,我得到一个编译错误,说我不能,rev h因为rev是类型[t] -> [t]但我试图在类型上调用它t,这是有道理的.我怎么能绕过这个?

recursion haskell types list

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

为什么在泛型类(Java)的构造函数中提供类型参数是错误的?

我只是从一本教科书中学习Java中的泛型,在那里它讨论了GenericStack<E>用一个实现的类ArrayList<E>.

因为为了创建一个字符串堆栈,您可以使用

GenericStack<String> = new GenericStack<String>()
Run Code Online (Sandbox Code Playgroud)

要么

GenericStack<String> new GenericStack<>()
Run Code Online (Sandbox Code Playgroud)

因此,不应该将构造函数 GenericStack定义为public GenericStack<E>(),或public GenericStack<>()?答案是不.它应该被定义为public GenericStack().

为什么是这样?显然,构造函数可以很容易地从类声明中推断出类型,但考虑到Java的冗长,我有点迷惑为什么<E>或者只是<>形式主义完全摆脱了这里.

java oop generics syntax constructor

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