小编Chr*_*hes的帖子

在 Rust 中返回可变引用

我正在学习 Rust,如果这是一个微不足道的问题,我深表歉意。我用谷歌搜索了一个小时无济于事。

我有一个枚举值数组。我希望在该数组中找到一个与特定模式匹配的随机位置并返回对它的可变引用,目的是修改该位置的元素。

enum Tile {
    Empty,
    ...  // Other enum values
}

fn random_empty_tile(arr: &mut [Tile]) -> &mut Tile {
    loop {
        let i = rand::thread_rng().gen_range(0, arr.len());
        let tile = &mut arr[i];
        if let Tile::Empty = tile {
            return tile;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

借用检查器在这里抱怨两件具体的事情。第一个是arr.len()调用。这是不允许的,因为它需要对 进行不可变引用arr,并且我们已经arr通过参数获得了对 的可变引用。因此,不能进行其他引用,并且不允许调用。

第二个是return tile。这会失败,因为借用检查器无法证明此引用的生命周期arr与其自身的生命周期相同,因此返回是不安全的。

我认为上面对错误的描述是正确的;我想我明白出了什么问题。不幸的是,我不知道如何解决这些问题。如果有人可以提供一个惯用的解决方案来实现这种行为,将不胜感激。

最后,我希望做到以下几点:

let mut arr = [whatever];
let empty_element = random_empty_tile(&mut arr);
*empty_element = Tile::SomeOtherValue;
Run Code Online (Sandbox Code Playgroud)

因此改变数组以替换空值。

rust

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

JavaFX - TextFlow 中的下标和上标文本

我一直在尝试在 JavaFX 中获取简单的富文本:我希望获得连续文本,其中某些字符为粗体、下标或上标。这在普通的 Text 或 Label 类中是不可能的。我尝试过WebView但没有成功,因为虽然它会显示这样的文本,但它的大小不适合其内容,因此占据了屏幕的不可控制的大部分。

现在我正在尝试使用TextFlow. 我可以成功地将Text对象链接在一起,其中一些可以加粗。然而,下标和上标被证明更加困难。下标可以通过减小字体大小来模拟,但是上标需要该Text对象高于其他对象。我找不到执行此操作的方法:TextFlow特别忽略Text对象的翻译属性,并且我无法覆盖getBaselineOffset()Text问题的问题,因为它是最终的。

我是否必须将Texts 放入 HBox 中?JavaFX 真的不支持这个吗?我想做的事情并不复杂;令人难以置信的是,没有对下标和上标的本机支持。

import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.text.TextFlow;

import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class TextFlowBuilder
{
private static final String BOLD = "<b>";
private static final String UN_BOLD = "</b>";

private static final String SUPERSCRIPT = "<sup>";
private static final String UN_SUPERSCRIPT = "</sup>";

private …
Run Code Online (Sandbox Code Playgroud)

java javafx javafx-8

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

Java - 使静态嵌套类对所有人可见,但只能由父类和父类的子类构造

我有一个包含类似结构的静态嵌套类的父类。嵌套类必须是公共的,因为它应该返回到对其内容进行操作的其他类。但是,只有父类及其子类应该能够实例化嵌套类,因为它们知道如何定义其内容。下面显示的所有类都位于不同的包中。

public abstract class Parent
{
    public static class Data
    {
        public final String data1
        ...

        public Data(String d1, ...)
        {
            data1 = d1;
            ...
        }
    }

    public abstract Data getData();
}
Run Code Online (Sandbox Code Playgroud)
public final class Subclass extends Parent
{
    @Override
    public Data getData()
    {
        return new Data(.....);
    }
}
Run Code Online (Sandbox Code Playgroud)
public class SomeOtherClass
{
    public void someMethod()
    {
        final Data d = new Subclass().getData();
        System.out.println(d.data1);
    }
}
Run Code Online (Sandbox Code Playgroud)

声明该类Dataprotected停止getData()正常工作。减少 的构造函数上的访问修饰符Data会阻止 的子类Parent …

java access-modifiers inner-classes

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

等待条件变量超时:锁定未及时重新获取

我有一个asyncio.Condition名为cond. 我想等它,但只能等那么久才放弃。由于asyncio.Condition.wait不需要超时,因此无法直接完成此操作。应该用于包装并提供超时的文档状态asyncio.wait_for

asyncio.wait_for() 函数可用于在超时后取消任务。

因此,我们得出以下解决方案:

async def coro():
    print("Taking lock...")
    async with cond:
        print("Lock acquired.")
        print("Waiting!")
        await asyncio.wait_for(cond.wait(), timeout=999)
        print("Was notified!")
    print("Lock released.")
Run Code Online (Sandbox Code Playgroud)

现在假设它coro自己在运行后五秒被取消。这将引发CancelledErrorwait_for,其中取消cond.wait前再上调错误。然后错误传播到coro,由于async with块,它隐式地尝试释放 中的锁cond。但是,当前未持有该锁;cond.wait已被取消,但没有机会处理该取消并重新获取锁。因此,我们得到一个丑陋的异常,如下所示:

Taking lock...
Lock acquired.
Waiting!
ERROR:asyncio:Task exception was never retrieved
future: <Task finished coro=<coro() done, defined at [REDACTED]> exception=RuntimeError('Lock is not acquired.',)>
Traceback (most recent call last):
  [REDACTED], …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio

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

Python拆分文本文件保留换行符

我正在尝试将文本文件拆分为单词,\n并被视为一个单词。

我的输入是这个文本文件:

War and Peace

by Leo Tolstoy/Tolstoi
Run Code Online (Sandbox Code Playgroud)

我想要一个这样的列表输出:

['War','and','Peace','\n','\n','by','Leo','Tolstoy/Tolstoi']
Run Code Online (Sandbox Code Playgroud)

使用.split()我得到这个:

['War', 'and', 'Peace\n\nby', 'Leo', 'Tolstoy/Tolstoi']
Run Code Online (Sandbox Code Playgroud)

所以我开始编写一个程序,将 \n 作为一个单独的条目放在单词后面,代码如下:

for oldword in text:
counter = 0
newword = oldword
while "\n" in newword:
    newword = newword.replace("\n","",1)
    counter += 1

text[text.index(oldword)] = newword

while counter > 0:
    text.insert(text.index(newword)+1, "\n")
    counter -= 1
Run Code Online (Sandbox Code Playgroud)

但是,该程序似乎挂在了线上counter -= 1,我终生无法弄清楚原因。

注意:我意识到如果这样做,结果将是 ['Peaceby',"\n","\n"]; 这是以后要解决的不同问题。

python counter split newline

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

无法通过 SSH 连接到 GitHub(但可以连接到 GitLab)

我在互联网上搜索并发现很多人都有类似的问题,但我的变体似乎是独一无二的。问题是我无法通过 ssh 连接到 GitHub 来进行推送/拉取(我使用的是 Windows 10)。

如果我跑ssh -T git@github.com

ssh: connect to host github.com port 22: Network is unreachable
Run Code Online (Sandbox Code Playgroud)

如果我跑ssh -T -p 443 git@github.com

Hi cjriches! You've successfully authenticated, but GitHub does not provide shell access.
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我跑ssh -T git@gitlab.com

Welcome to GitLab, @cjriches!
Run Code Online (Sandbox Code Playgroud)

再加上我尝试禁用 Windows 防火墙却无济于事,这似乎证明问题不仅仅在于端口 22。无论如何,我还可以通过 SSH 连接到其他完全与 git 无关的主机。由于某种原因,GitHub 拒绝连接。为了以防万一,我已经重新上传了公钥,所以问题肯定不存在。

有谁知道这到底是怎么发生的吗?

git ssh github

4
推荐指数
2
解决办法
2103
查看次数