小编Luk*_*odt的帖子

为什么我的stdin用户输入没有正确匹配?

我正在尝试获取系统输入并检查用户是否输入了是或否.我的字符串转换是错误还是什么?if块不执行.

use std::io;

fn main() {
    let mut correct_name = String::new();
    io::stdin().read_line(&mut correct_name).expect("Failed to read line");
    if correct_name == "y" {
        println!("matched y!");
    } else if correct_name == "n" {
        println!("matched n!");
    }
}
Run Code Online (Sandbox Code Playgroud)

rust

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

为闭包实现特征会导致绑定/具体的生命周期不匹配

我想为特定类型的闭包实现一个特征.这是一个最小的例子(游乐场):

trait Foo {
    fn foo(&self, x: &u32);
}

impl<F> Foo for F
    where F: Fn(&u32)
{
    fn foo(&self, x: &u32) {
        self(x)
    }
}

fn main() {
    let _: &FnOnce(&u32) = &|x| {};   // works
    let _: &Foo          = &|x| {};   // doesn't work
}
Run Code Online (Sandbox Code Playgroud)

它导致此错误:

error: type mismatch resolving `for<'r> <[closure@<anon>:16:29: 16:35] as std::ops::FnOnce<(&'r u32,)>>::Output == ()`:
 expected bound lifetime parameter ,
    found concrete lifetime [--explain E0271]
  --> <anon>:16:28
   |>
16 |>     let _: &Foo          = …
Run Code Online (Sandbox Code Playgroud)

traits lifetime rust

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

println的格式样式有什么区别?

我很遗憾地问这么简单的问题......前一天,我开始学习Rust并尝试了这个println!方法.

fn main() {
  println!("Hello {}!", "world");
}
-> Hello world!
Run Code Online (Sandbox Code Playgroud)

然后,我找到了其他格式样式:{}, {:}, {:?}, {?},...

我知道{}相反String,但我不理解其他格式风格.这些款式如何相互不同?我认为{:?}是数组或向量.这是对的吗?

请用示例代码解释这些格式样式:(

rust

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

哪个整数操作在Rust中具有更高性能的替代方法?

在Rust中编写将运行数百万次的整数函数(想想像素处理)时,使用性能最高的操作很有用 - 类似于C/C++.

虽然参考手册解释了行为的变化,但并不总是清楚哪种方法的性能高于标准(参见注释1)整数算术运算.我假设wrapping_add编译成等同于C的补充.

在标准操作(加/减/乘/模/除/移位/位操作...)中,哪些操作具有更高性能的替代方法,默认情况下不使用?


注意:

  1. 通过标准 我用符号的意思是整数运算a + b,i / kc % e...等等
    写数学表达式时,你会用什么-除非你有使用的一个封装或返回溢出的方法之一的特殊需要.
  2. 我意识到回答这个问题可能需要一些研究.因此,我很高兴通过查看生成的程序集来进行一些检查,以查看哪些操作正在使用未经检查/原始操作.
  3. 可能是检查/未检查操作之间的速度差异不大,如果是这种情况,我仍然希望能够编写一个"快速"版本的函数来与"安全"版本进行比较,来关于它是否是给定函数的合理选择我自己的结论.
  4. 提到像素处理后,SIMD已成为可能的解决方案.尽管这是一个很好的建议.这仍然留给我们使用SIMD 无法优化的情况,因此快速整数算法的一般情况仍然需要考虑.

micro-optimization rust llvm-codegen

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

"ref mut"模式中"由于需求冲突而无法推断出适当的模式生命周期"

struct RefWrap<'a> {
    wrap: &'a mut Option<String>,
}

impl<'a> RefWrap<'a> {
    fn unwrap(&mut self) -> &'a mut String {
        match *self.wrap {
            Some(ref mut s) => s,
            None => panic!(),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(游乐场)

据我所知,这段代码是正确的(返回的引用确实有生命周期'a.但Rust产生以下错误:

error[E0495]: cannot infer an appropriate lifetime for pattern due to conflicting requirements
 --> <anon>:8:18
  |
8 |             Some(ref mut s) => s,
  |                  ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

使用不可变引用,它可以正常工作.

一个类似的问题,但我很确定在这种情况下它没有帮助.

lifetime rust

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

结构拥有函数的Rust范围规则

我试图了解impl块内定义的函数的范围究竟是什么,但不接受&self作为参数.例如,为什么下面的代码块不能编译?我收到错误"无法generate_a_result在此范围内找到功能".

pub struct Blob {
    num: u32,
}

impl Blob {
    pub fn new() -> Blob {
        generate_a_result()
    }

    fn generate_a_result() -> Blob {
        let result = Blob {
            num: 0
        };

        result
    }
}
Run Code Online (Sandbox Code Playgroud)

struct scope function rust

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

无法克隆Vec <Box <Trait >>因为Trait无法成为对象

我正在尝试克隆盒装特征的向量.自然地简单地派生Clone所有实现我的特征的结构是不够的,因为编译器在编译时不知道实现特征的所有结构都有Clone.

好的,所以我接着尝试使用Clonesupertrait,但这只会导致标题中的错误.我对解决方案感到茫然.

这是最小工作实现(或不工作,因为我无法克隆)

#![allow(dead_code, unused_macros)]
use std::fmt::Debug;

trait MusicElement: Debug + Clone {
    fn duration(&self) -> f32;
}

#[derive(Debug, Clone)]
struct Note<'a> {
    name: &'a str,
    duration: f32,
}

impl<'a> MusicElement for Note<'a> {
    fn duration(&self) -> f32 {
        self.duration
    }
}

#[derive(Debug, Clone)]
struct Pause {
    duration: f32,
}

impl MusicElement for Pause {
    fn duration(&self) -> f32 {
        self.duration
    }
}

#[derive(Debug, Clone)]
struct Sequence {
    elements: Vec<Box<MusicElement>>,
}

impl MusicElement for …
Run Code Online (Sandbox Code Playgroud)

clone rust trait-objects

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

如何为类型引用的操作指定通用特征?

我正在尝试创建一个对通用数字类型进行抽象的特征。指定我希望 trait 需要T + T(即T: Add<T>)很容易。我什至可以指定T + &T在特征中,然后在实现该特征的某种类型的泛型函数中使用它。

然而,当我尝试为&T + T(ie for<'a> &'a Self: Add<Self>) 和&T + &T特征添加约束时,我遇到了问题。奇怪的是impl,在为数字特征编写毯子时,以及在为该特征的任何类型编写通用函数时,我可以毫无问题地指定这些相同的约束,但是我无法让编译器让我只指定这些约束一次相反的特质。

简化示例

use std::ops::Add;

trait Numeric where
    Self: Sized,
    // T + T
    Self: Add<Output = Self>,
    // T + &T
    Self: for<'a> Add<&'a Self, Output = Self>,
    // &T + T
    // should specify &T + T on this trait but instead causes compile
    // errors everywhere I try …
Run Code Online (Sandbox Code Playgroud)

generics traits rust

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

getDisplayMedia() 在 Android 设备上无法正常工作

我需要将用户显示媒体(屏幕截图)连接到 webRTC 应用程序。

以下代码用于启动屏幕捕获:

navigator.mediaDevices.getDisplayMedia({video: true})
Run Code Online (Sandbox Code Playgroud)

这会提示用户有关屏幕捕获的信息,并创建一个视频流,在授予权限后即可使用该视频流。但是我无法让它在 iOS 或 Android 设备上运行。

iPad 我正在测试此功能,但无法找到navigator.mediaDevices.getDisplayMedia - undefined (iOS 13.3)

当我尝试调用 Android 上的 Chrome (v79) 时,它显示以下错误:

DOMException:无效状态

根据此: https: //developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia 如果代码不是由用户操作启动,则可能会生成错误,但这不应该是问题就我而言,因为代码是这样调用的:

startScreenSharing = event => {
 navigator.mediaDevices.getDisplayMedia({video: true})
}

<Button onClick={this.startScreenSharing} />
Run Code Online (Sandbox Code Playgroud)

事件变量保存有效事件,但我仍然收到“无效状态”错误。

这一定是我所缺少的,因为它在桌面 Chrome 和 Safari 上运行良好。

编辑

我遇到了这个:getDisplayMedia 和屏幕录制的演示,并在此网页上生成了相同的错误。这可能是由于我的硬件设备设置造成的吗?

javascript twilio webrtc reactjs get-display-media

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

检查命令是否在PATH /可执行文件中作为进程

我想通过执行外部程序std::process::Command::spawn.此外,我想知道产生进程失败的原因:是因为给定的程序名不存在/不存在于PATH中还是因为某些不同的错误?

我想要实现的示例代码:

match Command::new("rustc").spawn() {
    Ok(_) => println!("Was spawned :)"),
    Err(e) => {
        if /* ??? */ {
            println!("`rustc` was not found! Check your PATH!")
        } else {
            println!("Some strange error occurred :(");
        }
    }, 
}
Run Code Online (Sandbox Code Playgroud)

当我尝试执行不在我的系统上的程序时,我得到:

Error { repr: Os { code: 2, message: "No such file or directory" } }
Run Code Online (Sandbox Code Playgroud)

但我不想依赖于此.有没有办法确定PATH中是否存在程序?

rust

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