我正在尝试获取系统输入并检查用户是否输入了是或否.我的字符串转换是错误还是什么?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) 我想为特定类型的闭包实现一个特征.这是一个最小的例子(游乐场):
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) 我很遗憾地问这么简单的问题......前一天,我开始学习Rust并尝试了这个println!方法.
fn main() {
println!("Hello {}!", "world");
}
-> Hello world!
Run Code Online (Sandbox Code Playgroud)
然后,我找到了其他格式样式:{}, {:}, {:?}, {?},...
我知道{}相反String,但我不理解其他格式风格.这些款式如何相互不同?我认为{:?}是数组或向量.这是对的吗?
请用示例代码解释这些格式样式:(
在Rust中编写将运行数百万次的整数函数(想想像素处理)时,使用性能最高的操作很有用 - 类似于C/C++.
虽然参考手册解释了行为的变化,但并不总是清楚哪种方法的性能高于标准(参见注释1)整数算术运算.我假设wrapping_add编译成等同于C的补充.
在标准操作(加/减/乘/模/除/移位/位操作...)中,哪些操作具有更高性能的替代方法,默认情况下不使用?
注意:
a + b,i / k或c % e...等等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)
使用不可变引用,它可以正常工作.
有一个类似的问题,但我很确定在这种情况下它没有帮助.
我试图了解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) 我正在尝试克隆盒装特征的向量.自然地简单地派生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) 我正在尝试创建一个对通用数字类型进行抽象的特征。指定我希望 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) 我需要将用户显示媒体(屏幕截图)连接到 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 和屏幕录制的演示,并在此网页上生成了相同的错误。这可能是由于我的硬件设备设置造成的吗?
我想通过执行外部程序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中是否存在程序?