小编Cod*_*ich的帖子

根据他们需要实施的特性,闭包如何推断出他们的类型?

我正在编写一个接受不同特征实现者的函数.其中一个是关闭.有些闭包需要参数类型注释,有些则不需要,具体取决于它们的主体.

示例(游乐场):

fn main() {
    bar(|x| x);
    bar(|x: bool| !x); // Why is the annotation needed?
}

trait Foo<T> {
    type Output;
}

impl<F: Fn(T) -> O, T, O> Foo<T> for F {
    type Output = O;
}

fn bar(_: impl Foo<bool, Output = bool>) {}
Run Code Online (Sandbox Code Playgroud)
  • 为什么有些闭包会推断出参数类型而其他闭包需要注释?

  • 是否有可能重新设计特征或功能从不需要注释?

我的(无效)推理是两个闭包的推理是相同的:

  1. bar 需求 Foo<bool, Output = bool>
  2. 只有Fn(bool) -> bool工具Foo<bool, Output = bool>
  3. 关闭必须是 |bool| -> bool

否定(Nottrait)将输入类型与输出类型分离的事实应该无关紧要,但它似乎在某种程度上是一个关键因素.

generics closures traits rust

10
推荐指数
1
解决办法
189
查看次数

如何在 OpenAPI 中为每个索引(即元组)定义一个具有具体项目定义的 JSON 数组?

我需要在 OpenAPI 中定义带有数组的 JSON 响应。该数组始终包含 2 个项目,第一个项目始终是数字,第二个项目始终是字符串。

[1, "a"]    //valid
["a", 1]    //invalid
[1]         //invalid
[1, "a", 2] //invalid
Run Code Online (Sandbox Code Playgroud)

我发现 JSON 模式确实通过传递项目列表而items不是单个对象(source)来支持这一点,但 OpenAPI 明确禁止这样做,并且只接受单个对象(source)。那如何用 OpenAPI 来表达呢?

tuples openapi

9
推荐指数
1
解决办法
5214
查看次数

如何在Linux上将Intellij升级到2017?

我想将Intellij从2016.3升级到2017.1.这是一个重大的升级,所以单击"升级"是不可行的,我必须下载一个全新的tar.gz. 问题是我不想进行全新安装,因为我有一些插件和配置,我宁愿不松动.我该怎么做?

intellij-idea

7
推荐指数
1
解决办法
7687
查看次数

特质的泛型类型和通用的相关类型之间有什么区别?

在Rust中提供通用关联类型之前会询问此问题,尽管它们是提出开发的.

我的理解是,特质泛型和相关类型在它们可以绑定到结构的类型数量上有所不同.

泛型可以绑定任意数量的类型:

struct Struct;

trait Generic<G> {
    fn generic(&self, generic: G);
}

impl<G> Generic<G> for Struct {
    fn generic(&self, _: G) {}
}

fn main() {
    Struct.generic(1);
    Struct.generic("a");
}
Run Code Online (Sandbox Code Playgroud)

关联类型只绑定1种类型:

struct Struct;

trait Associated {
    type Associated;

    fn associated(&self, associated: Self::Associated);
}

impl Associated for Struct {
    type Associated = u32;

    fn associated(&self, _: Self::Associated) {}
}

fn main() {
    Struct.associated(1);
    // Struct.associated("a"); // `expected u32, found reference`
}
Run Code Online (Sandbox Code Playgroud)

通用关联类型是这两者的混合.它们绑定到一个类型正好相关的1个生成器,而这个生成器又可以关联任意数量的类型.那么Generic前一个例子与这个通用关联类型有什么区别? …

generics generic-programming rust

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

如何编写确保编译错误的测试?

我想证明我的 API 通过编译失败静态地防止了无效使用。

有一些工具可以确保代码在运行时发生混乱 ( #[should_panic]),但我找不到任何编译失败的原因。doc 测试似乎最有前途,因为每个片段都是一个单独的编译单元,但似乎只有恐慌检查。

testing integration-testing unit-testing rust

7
推荐指数
1
解决办法
721
查看次数

如果我已经实现了Drop,为什么使用PhantomData来通知编译器结构拥有泛型?

Rustonomicon的指南中PhantomData,有一部分关于如果a Vec-like struct有*const T字段会发生什么,但是没有PhantomData<T>:

下拉检查器将慷慨地确定Vec<T>不具有任何类型的值T.这将使得它得出结论,它不需要担心在析构函数中Vec丢弃任何T用于确定跌落检查稳健性的任何东西.这反过来又允许人们使用Vec析构函数创建不健全的东西.

这是什么意思?如果我实现Drop一个结构并手动销毁T它中的所有s,为什么我应该关心编译器是否知道我的struct拥有一些Ts?

rust

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

为什么trait对象vtable包含大小和对齐?

Rust的trait对象是胖指针,包含2个常规指针:数据和vtable.vtable是一个包含析构函数指针,所有特征方法指针以及最后数据大小和对齐的结构.

大小和对齐字段是什么?

我找不到多少:

  • 博客文章 - 答:它是用于释放内存,但今天没有使用,可能会被一些未来,更灵活的机制使用(它可能是什么?有任何存在吗?)
  • 博客文章B:它用于解除分配类型擦除的盒装值,因此他们知道如何释放内存(不Box存储位置,大小和分配的对齐方式?每个DST的每个大小变体都无法获得自己的vtable版本, 它可以?)

dynamic vtable rust

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

如何将整个箱子传递给程序宏?

我正在尝试将整个箱子传递给程序宏。

我尝试将此代码放在我的之上lib.rs

#![my_macro]
#![feature(proc_macro)]
extern crate my_macro;
use my_macro::{my_macro};
Run Code Online (Sandbox Code Playgroud)

并失败了:error: cannot find attribute macro 'my_macro' in this scope

我也尝试将宏调用放在子句下面use

#![feature(proc_macro)]
extern crate my_macro;
use mock_macro::{my_macro};
#![my_macro]
Run Code Online (Sandbox Code Playgroud)

但也失败了:error: an inner attribute is not permitted in this context

有可能做到吗?(我知道syn有一个解析整个箱子的功能)

rust

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

是否有文件对象的文档?

这可能是一个非常愚蠢的问题,但老实说,我无法在Python 3中找到文件对象API的文档.

Python文档用于使用或返回文件对象的内容,open或者sys.stdin通过高级别介绍链接到词汇表.它没有列出这些对象暴露的函数,我不知道,我能用它做什么.我已经尝试使用谷歌搜索文件对象文档,但搜索引擎似乎不明白,我在寻找什么.

我是Python的新手,但不是一般的编程.到目前为止,我使用对象的方案是找到完整的API引用,查看它可以做什么,然后选择要在我的代码中使用的方法.在Python世界中这是错误的心态吗?有哪些替代方案?

python python-3.x

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