小编Pau*_*erg的帖子

如何扩展Mocha的Context接口?

采取以下代码片段:

import { Foo } from "./foo";

export interface MyContext extends Mocha.Context {
  foo: Foo;
}
Run Code Online (Sandbox Code Playgroud)

这是在安装了@types/mocha包的项目中,以便Mocha编译器可以推断命名空间。

现在,如果我尝试在测试套件中使用此接口:

import { MyContxt } from "../types/mocha";

describe("my test suite", function() {
  it("should do something", function(this: MyContext) {
    ...
  });
});
Run Code Online (Sandbox Code Playgroud)

TypeScript 编译器抛出以下错误:

没有重载与此调用匹配。

我查找了源代码,似乎 mocha 期望传递给beforebeforeEachit等钩子的任何函数都链接到Context中定义的类型@types/mocha- 它不接受任何后代类型。

如何解决这个问题并在我的测试环境中扩展 Mocha Context 接口?

types mocha.js typescript

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

无论如何,“context”和“with_context”之间有什么区别?

这是无论如何Context的文档:

/// Wrap the error value with additional context.
fn context<C>(self, context: C) -> Result<T, Error>
where
    C: Display + Send + Sync + 'static; 
Run Code Online (Sandbox Code Playgroud)
/// Wrap the error value with additional context that is evaluated lazily
/// only once an error does occur.
fn with_context<C, F>(self, f: F) -> Result<T, Error>
where
    C: Display + Send + Sync + 'static,
    F: FnOnce() -> C;
Run Code Online (Sandbox Code Playgroud)

在实践中,不同之处在于with_context需要一个闭包,如无论如何的README所示:

use anyhow::{Context, Result};

fn main() -> Result<()> { …
Run Code Online (Sandbox Code Playgroud)

methods error-handling closures lazy-evaluation rust

3
推荐指数
2
解决办法
498
查看次数

为什么我们需要“cacheRedirects”?

我阅读了有关与缓存数据交互的文档,虽然我了解如何cacheRedirects工作,但我有点困惑为什么首先需要它。这就是我问另一个问题的部分原因:Apollo 客户端是否缓存 React 中的嵌套对象

我们知道数据很可能已经在客户端缓存中,但由于它是通过不同的查询请求的,Apollo 客户端并不知道这一点。

这是为什么?

为了清楚起见,复制粘贴文档中的示例:

query ListView {
  books {
    id
    title
    abstract
  }
}

query DetailView {
  book(id: $id) {
    id
    title
    abstract
  }
}
Run Code Online (Sandbox Code Playgroud)

apollo graphql apollo-client apollo-cache-inmemory

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

由于需求冲突,无法为生命周期参数“de”推断合适的生命周期

采用以下代码片段(必须在货物中运行,以便您可以将serde功能添加到num-bigint):

use num_bigint::BigInt;
use serde_derive::Deserialize;
use std::collections::HashMap;

#[derive(Debug, Deserialize)]
pub struct Trade<'a> {
    pub id: &'a str,
    pub price: BigInt,
    pub quantity: BigInt,
}

#[derive(Debug, Deserialize)]
pub struct TradeTable<'a> {
    pub trades: Vec<Trade<'a>>,
}

fn main() {
    let mut ether_trades: Vec<Trade> = Vec::new();
    ether_trades.push(Trade {
        id: "#1",
        price: BigInt::from(100),
        quantity: BigInt::from(2)
    });

    let mut trades: HashMap<&str, Vec<Trade>> = HashMap::new();
    trades.insert("ETH", ether_trades);
    println!("trades: {}", trades);
}
Run Code Online (Sandbox Code Playgroud)

编译时会出现此错误:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'de` …
Run Code Online (Sandbox Code Playgroud)

lifetime rust

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

您可以覆盖 create-react-app@3.x 中的 NODE_ENV 环境变量吗?

NODE_ENV当我在开发节点 ( ) 中构建 React 应用程序时,我想手动更改环境变量的值yarn run start

environment-variables create-react-app

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

为什么在结束“循环”时“中断”不需要分号?

摘自Rust 书的第 3.5 章

我们使用break带有 value的关键字counter * 2。在循环之后,我们使用分号结束为 赋值的语句result

加上代码片段:

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}
Run Code Online (Sandbox Code Playgroud)

我明白这是如何工作的以及为什么结果是 20,但我注意到如果我删除包含break关键字的行上的分号,程序是等效的。

为什么在这种情况下分号是可选的?

syntax loops break keyword rust

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

为什么在 Rust 中“按引用捕获”等同于“按值捕获引用”?

摘自 Huon Wilson在 Rust 中发现闭包

完全按值捕获也比按引用捕获更通用:引用类型在 Rust 中是一流的,因此“按引用捕获”与“按值捕获引用”相同。因此,与 C++ 不同,按引用捕获和按值捕获之间几乎没有根本区别,而且 Rust 所做的分析实际上并不是必需的:它只是让程序员的生活更轻松。

我努力想办法解决这个问题。如果您“按值”捕获引用,您不捕获存储在堆上的数据吗?或者它是否引用了在堆栈中找到的引用的指针值?

memory closures pass-by-reference pass-by-value rust

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

如何模式匹配选项&lt;&amp;Path&gt;?

我的代码看起来像这样:

// my_path is of type "PathBuf"
match my_path.parent() {
    Some(Path::new(".")) => {
        // Do something.
    },
    _ => {
        // Do something else.
    }
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下编译器错误:

expected tuple struct or tuple variant, found associated function `Path::new`
for more information, visit https://doc.rust-lang.org/book/ch18-00-patterns.html
Run Code Online (Sandbox Code Playgroud)

我读了Rust 书中的第 18 章,但我不知道如何使用PathPathBuf类型来修复我的特定场景。

如何通过检查特定值(如 )来进行模式匹配Option<&Path>(根据文档,这是方法返回的内容) ?parentPath::new("1")

pattern-matching rust

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

如何以独立于平台的方式将“./”添加到路径中?

我需要./在我的代码中添加路径,我目前正在这样做:

let path = Path::new("foo.sol");
let path_with_dot = Path::new("./").join(path);
Run Code Online (Sandbox Code Playgroud)

但是,我想./在路径前面添加的同时保持跨多个平台的兼容性。我怎样才能做到这一点?

platform cross-platform path platform-independent rust

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

如何在 Rust 写入文件之前删除文件的内容?

我编写了一个机器人,它每隔一段时间执行一次网络查询,并将最新状态转储到存储在磁盘上的文件中。这是我的代码:

let log_file = OpenOptions::new()
    .read(true)
    .write(true)
    .create(true)
    .open(&log_file_name)
    .unwrap();
serde_json::to_writer(
    log_file,
    &State {
        foo: self.foo,
        bar: self.bar
    },
)
.unwrap();
Run Code Online (Sandbox Code Playgroud)

问题是,有时,最新状态 json 的大小会小于先前状态 JSON 的大小。这使得前一个状态 JSON 中比新状态 JSON 长的部分保留在日志文件中:

{"foo": 1,"bar": 2}"baz": 3}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,"baz": 3}是来自先前状态 JSON 的剩余数据。

问题是:如何重写代码,以便首先刷新文件的所有内容,然后编写新的状态 json?

我知道删除文件是一种解决方案,但我不想这样做。

file-io json file file-writing rust

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