我正在使用图像包来进行图片处理,并希望创建一个小包装器,以使我的代码更有趣.
extern crate image;
const BLACK: [u8; 4] = [0, 0, 0, 255];
const WHITE: [u8; 4] = [255, 255, 255, 255];
const RED: [u8; 4] = [255, 0, 0, 255];
pub struct Picture {
buffer: image::ImageBuffer,
width: u32,
height: u32
}
impl Picture {
// My functions like fill(), line() etc.
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译它时,我有一个错误:
src\pic.rs:11:13: 11:31 error: wrong number of type arguments: expected 2, found 0 [E0243]
src\pic.rs:11 buffer: image::ImageBuffer,
^~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
在源代码中,我看到它ImageBuffer接受两个参数:
pub struct ImageBuffer<P: Pixel, …Run Code Online (Sandbox Code Playgroud) 第一个Rust程序将无法编译,因为b它在引用之前被删除r,这是有道理的:
fn main() {
let a = "a";
let v;
{
let b = "b";
v = &b;
}
println!("{}", v);
}
Run Code Online (Sandbox Code Playgroud)
在第二个Rust程序中,b通过函数检索引用,突然之间没有问题:
fn getRef(b: &str) -> &str {
b
}
fn main() {
let a = "a";
let v;
{
let b = "b";
v = getRef(&b);
}
println!("{}", v);
}
Run Code Online (Sandbox Code Playgroud)
问题是,v仍然是一个参考b,并且b超出范围println!().
为什么这两个不同?
我如何创建一个空的[u8]然后传递给openssl函数,以便它可以将结果写入其中?
fn test_encrypt(key_pair: openssl::rsa::Rsa) {
let text = b"Hello";
println!("{:?}", text);
let mut result = b" ";
let pad = openssl::rsa::Padding::from_raw(1);
key_pair.private_encrypt(text, result, pad);
}
Run Code Online (Sandbox Code Playgroud)
我的代码当前导致以下错误:
fn test_encrypt(key_pair: openssl::rsa::Rsa) {
let text = b"Hello";
println!("{:?}", text);
let mut result = b" ";
let pad = openssl::rsa::Padding::from_raw(1);
key_pair.private_encrypt(text, result, pad);
}
Run Code Online (Sandbox Code Playgroud) A u32占用4个字节的内存,a String占用3个指针大小的整数(用于位置,大小和保留空间),在栈上加上一些内存。
在我看来,这意味着Rust在执行代码时不知道在特定位置存储什么类型,因为这种知识将需要更多的内存。
但是同时,是否不需要知道在0xfa3d2f10存储什么类型,以便能够解释该位置的字节?例如,要知道接下来的字节构成String堆上a的规范吗?
所以我已经完成了关于Rust的90%的教程,我想我大部分都掌握了语法.我正在尝试用它来开始编写代码我正在使用该rustc_serialize库解析JSON stdin,我没有得到我期望的结果.我有以下JSON文件,名为message.txt以下内容:
{"text": "hello world"}
Run Code Online (Sandbox Code Playgroud)
这是接受stdin和解析text字段的Rust代码:
extern crate rustc_serialize;
use std::io::{self, Read};
use rustc_serialize::json::Json;
fn main() {
// provide a buffer for stdin
let mut buffer = String::new();
let _ = io::stdin().read_to_string(&mut buffer);
// parse the json
let message = match Json::from_str(&mut buffer) {
Ok(m) => m,
Err(_) => panic!("Stdin provided invalid JSON")
};
// get the message object and "text" field string
let message_object = message.as_object().unwrap();
let message_string = message_object.get("text").unwrap(); …Run Code Online (Sandbox Code Playgroud) 考虑以下(哑)程序:
fn main() {
let mut array = &mut [1u8, 2u8, 3u8];
for &mut value in array {
}
}
Run Code Online (Sandbox Code Playgroud)
它编译并运行正常(虽然警告未使用的变量/不必要的可变性,如预期的那样).但是&mut在for声明中做了什么?
它似乎没有给你一个可变的数组引用,因为尝试value = 0;在错误中分配结果:
error[E0384]: re-assignment of immutable variable `value`
Run Code Online (Sandbox Code Playgroud)
这是&mut一个无操作吗?
我对Rust for循环的工作方式感到困惑。考虑以下:
#![feature(core_intrinsics)]
fn print_type_of<T>(_: T) {
println!("{}", unsafe { std::intrinsics::type_name::<T>() });
}
fn main() {
let nums = vec![1, 2, 3];
for num in &nums { print_type_of(num); }
for num in nums { print_type_of(num); }
}
Run Code Online (Sandbox Code Playgroud)
它输出以下内容:
&i32
&i32
&i32
i32
i32
i32
Run Code Online (Sandbox Code Playgroud)
传递向量for与引用向量相比是什么意思?为什么当您传递参考时,您获得对项目的参考,而当您传递实际向量时,却获得了实际项目?
例如:
struct ABC;
impl ABC {
fn some_method(&self) -> &str {
// return the name of its struct -> "ABC"
}
}
Run Code Online (Sandbox Code Playgroud)
我正在编写Python扩展,我需要一种方法来返回其repr方法的当前结构名称.在Python中,我可以使用它self.__class__.__name__.Rust中有类似的东西吗?
Rust文档说默认的整数类型是i32,这意味着变量默认可以保存的最大数字是2147483647ie 2e31 - 1。事实证明,这是千真万确的:如果我试图挽救数量大于2e31 - 1在x变,我得到的错误literal out of range。
码
fn main() {
let x = 2147483647;
println!("Maximum signed integer: {}", x);
let x = 2e100;
println!("x evalues to: {}", x);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我2e100在x变量中保存值,为什么我不会出错?它的计算结果肯定大于2e31 - 1。
输出量
fn main() {
let x = 2147483647;
println!("Maximum signed integer: {}", x);
let x = 2e100;
println!("x evalues to: {}", x);
}
Run Code Online (Sandbox Code Playgroud)
码
fn main() {
let …Run Code Online (Sandbox Code Playgroud) 我正在通过rustlings练习来学习 Rust。我已经达到了iterator3.rs练习并且被卡住了。这个练习要求我提供一行代码,作为操作的一部分,将结果从一种类型映射到另一种类型;我需要用正确的操作填写 x= 行。有两部分 - 第一部分阅读:
let numbers = vec![27, 297, 38502, 81];
let division_results = numbers.into_iter().map(|n| divide(n, 27));
let x = ???
assert_eq!(format!("{:?}", x), "Ok([1, 11, 1426, 3])");
Run Code Online (Sandbox Code Playgroud)
下一个是相同的,但输出断言的格式略有不同:
assert_eq!(format!("{:?}", x), "[Ok(1), Ok(11), Ok(1426), Ok(3)]");
Run Code Online (Sandbox Code Playgroud)
我相信我明白第一个实例需要返回一个包含 i32 向量或某种错误类型的结果。第二个需要返回一个结果向量,每个结果都有一个 i32 或一个错误类型。
但是,我通常难以理解如何确定 into_iter、map 和 collect 的组合返回的类型。我可以使用一些帮助来学习如何推理或获得编译器帮助。
这是我到目前为止的位置:
我不明白 Division_results 的结果类型是什么。我曾尝试使用编译器错误消息以及此问题的答案来查找,但结果对我来说是不透明的,可能是因为懒惰的评估。例如,只需将 x 替换为 Division_results,这样 assert 就会显示类型,如下所示:
assert_eq!(format!("{:?}", division_results), "Ok([1, 11, 1426, 3])");
Run Code Online (Sandbox Code Playgroud)
给我这个结果:
left: `"Map { iter: IntoIter([27, 297, 38502, 81]) }"`,
right: `"Ok([1, 11, …Run Code Online (Sandbox Code Playgroud)