小编Isa*_*old的帖子

如何完全删除乌龟

我制作了一个用于图形的小tkinter游戏turtle。它是对来自 Cracker Barrel 的 Triangle Peg Game 的模拟,能够告诉玩家在游戏中的任何时间点的下一个最佳移动,以及其他功能。Pegs 只是 的一个子类的实例turtle.RawPen,我保留了很多普通的RawPenaround实例来绘制代表移动的箭头。

我注意到当我重新启动游戏(调用turtle.bye())以杀死海龟窗口时,内存消耗实际上增加了,因为海龟似乎没有被删除。即使我window.clear()事先调用,清除_turtleswindow.__dict__,仍然有对海龟的引用。我确保在重新启动期间删除了我对它们的所有引用,所以这不是问题。有没有办法真正删除乌龟,以便它可以被垃圾收集?

python turtle-graphics

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

为什么从主线程调用时`std::promise::set_value` 会抛出错误?

当我运行以下代码时,

#include <future>

int main()
{
    std::promise<int> p;
    p.set_value(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

std::system_error被抛出。但是,当我在另一个线程中设置 promise 的值时,

#include <future>
#include <thread>

int main()
{
    std::promise<int> p;
    std::thread([&]{p.set_value(1);}).join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一切正常。根据我的理解std::promise,调用set_value不应该抛出异常,除非 promise 没有共享状态(即它已被移出)或者已经为其分配了值,即使那样它也会抛出std::future_error,而不是std::system_error。由于没有数据竞争或任何类似的情况,因此我是set_value从创建承诺的线程还是在另一个线程中调用都无关紧要。有什么我想念的吗?

我已经使用g++clang尝试过这个,结果相同。具体来说,当我在顶部运行代码时,以下输出到stderr

terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

这些命令用于编译顶部的代码,

g++ main_thread.cpp -o main_thread -std=c++17 -g -Og
clang main_thread.cpp -o main_thread -std=c++17 -lstdc++

Run Code Online (Sandbox Code Playgroud)

这些用于编译底部的代码:

g++ …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading c++-standard-library

6
推荐指数
1
解决办法
146
查看次数

无法为Collectors.toMap推断类型变量

我正在尝试创建一个EnumMap简单地将枚举的常量映射到各自的序数.我想我可以如此简洁地这样做:

private static Map<Rank, Integer> defaultRankOrdering = new EnumMap<>(
    Arrays.stream(Rank.values()).collect(
        Collectors.toMap(Function::identity, e -> e.ordinal())));
Run Code Online (Sandbox Code Playgroud)

但是,编译器说它无法推断出任何类型变量toMap.考虑到这一点,我不明白为什么,根据以下两个参数的签名toMap:

public static <T, K ,U> Collector<T, ? ,Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper,
                                                         Function<? super T, ? extends U> valueMapper)
Run Code Online (Sandbox Code Playgroud)

T应该推断为Rank,作为Arrays.stream(Rank.values())a Stream<Rank>,K也应该推断为Rank,作为Function.identity返回a Function<T, T>,并且U应该推断为Integer因为返回类型Enum.ordinalint,Integer在这种情况下应该加框.

任何帮助将不胜感激.

java lambda java-8 java-stream collectors

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

将包私有类导入 JShell

在 Java 9 发布后,我在玩 JShell,并尝试导入我制作的包。由于我为其编码的整个应用程序将包含在该包中,因此除了一个类(我尚未编码)之外的每个类都是包私有的。我的类路径是正确的,但我仍然无法使用 JShell 中包中声明的任何类型(它会引发“找不到符号”错误)。我是否需要将它们公开以供访问,或者有什么方法可以测试包私有类?这是我试过的确切代码。

我当前的目录是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src
Run Code Online (Sandbox Code Playgroud)

我的课程路径是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls
Run Code Online (Sandbox Code Playgroud)

包目录(用于字节码)是

C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\cls\collatz
Run Code Online (Sandbox Code Playgroud)

CollatzSequence是包含在collatz.

PS C:\Users\Sylvaenn> cd OneDrive\Documents\Programs\Java\src
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> import collatz.*;

jshell> CollatzSequence seq = new CollatzSequence(BigInteger.ONE);
|  Error:
|  cannot find symbol
|    symbol:   class CollatzSequence
|  CollatzSequence seq = new CollatzSequence(BigInteger.ONE);
|  ^-------------^
|  Error:
|  cannot find symbol
|    symbol:   class CollatzSequence
|  CollatzSequence seq …
Run Code Online (Sandbox Code Playgroud)

java packages private java-9 jshell

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

三元运算符与 if-else 语句的性能

注意:这个问题确实已经在许多其他语言中得到了解答。但是,我找不到 Python 的答案,所以不要标记为重复。

Python 中的 if-else 语句和三元运算符在性能上有区别吗?

python if-statement ternary-operator

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

有符号整数类型的大小可以与C / C ++中其对应的无符号类型的大小不同吗?

例如,实现可以定义sizeof(signed int)为两个字节并sizeof(unsigned int)为四个字节吗?在C / C ++ 参考中,我找不到任何明确禁止此操作的东西,尽管有符号和无符号版本类型的最小大小是相对应的,并且我看不出任何逻辑上的原因,即它们的大小应该不同。

c c++

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