在某些情况下,从 Python 脚本(可能来自不受信任的来源)读取数据并从中提取值很有用。
尽管在大多数情况下 XML/JSON/YAML/TOML 等格式更适合,但有时这样做很有用。
如何从 Python 脚本中提取变量名称和值而不执行它?
(假设值构造不包含其创建的代码执行)
随着gcc的-Wconversion警告,看起来chars和short被隐式转换为int.
#include<stdio.h>
#pragma GCC diagnostic warn "-Wconversion"
void main(void)
{
short i = 1;
short j = 1;
short k = j & ~i;
printf("value %d\n", j);
}
Run Code Online (Sandbox Code Playgroud)
给出以下警告,
test.c: In function 'main':
test.c:9:15: warning: conversion to 'short int' from 'int' may alter its value [-Wconversion]
short k = j & ~i;
^
Run Code Online (Sandbox Code Playgroud)
回到一个简短的静音警告,short k = j & (short)~i;但这有点奇怪添加变量类型已经匹配的强制转换.
我调查了是否进一步并(unsigned short)~(unsigned short)0导致了结果0xffff.
凡为~(unsigned short)0的结果0xffffffff
任何人都可以推荐一个处理这些警告的好方法吗?
除了禁用-Wconversion.
在 Rust 中,您可以声明一个具有特定大小的数组:
struct Vector(f64, f64);
fn main() {
let points: [Vector; 3] = [
Vector(1.0, 1.0),
Vector(5.0, 5.0),
Vector(0.0, 0.0),
];
println!("Length is {}\n", points.len());
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让长度(3在本例中)是隐式的,因为数组中有 3 个元素。与 C 中的操作类似:
struct Vector(f64, f64);
fn main() {
let points: [Vector; 3] = [
Vector(1.0, 1.0),
Vector(5.0, 5.0),
Vector(0.0, 0.0),
];
println!("Length is {}\n", points.len());
}
Run Code Online (Sandbox Code Playgroud)
请注意,这绝对是一个初学者问题。
在Rust中,你可以写(x * x)为x.powi(2).
是否有任何理由/反对包装(x * x) (除了可读性和个人偏好)到Rust中的函数/宏,或者这相当于使用x.powi(2)?
(其中常数2在x.powi(2)被折叠并转换成x * x)
有时索引需要紧密打包(例如网格几何),其中有用的是存储索引u32而不是usize.
有没有办法在Rust中索引向量而不必usize每次都显式地转换为?例如:
vector[some_u32 as usize];
Run Code Online (Sandbox Code Playgroud)
在单个实例中进行转换不是问题,在经常需要时它只是单调乏味.
有没有办法避免在这里施放?
我有一些从另一种语言格式化的测试数据.数据是一个浮点数组,但有些成员会错过小数点.
[0, 0], [0, 1], [1, 0.5], ... (100多个项目).
有没有办法让Rust定义一个f64/ f32不必将小数点添加到每个值的数组?
我Into在Rust中使用多个参数,并希望避免许多任务和愚蠢的错误.
pub fn my_fancy_function<T>(v: T, u: T, i: T, l: T, j: T)
where T: Into<MyStruct>
{
let v = v.into();
let u = u.into();
let i = l.into(); // Oops, I transposed these!
let l = i.into();
let j = j.into();
// some code
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免写出大量的作业?宏可能能够这样做:
expand_into!(v, u, i, l, j);
Run Code Online (Sandbox Code Playgroud)
这个方法没有什么特别之处into(),它只是一个例子,你可能经常在一个函数的开头重新声明许多参数,这种参数可以很容易地重复删除.
如何在没有Rust移动第一次访问的情况下访问选项中的向量?
fn maybe_push(v_option: Option<&mut Vec<usize>>) -> usize {
let mut c = 0;
if let Some(v) = v_option {
for i in 0..10 {
v.push(i);
c += i;
}
} else {
for i in 0..10 {
c += i;
}
}
// second access, fails
if let Some(v) = v_option {
for i in 10..20 {
v.push(i);
c += i;
}
} else {
for i in 10..20 {
c += i;
}
}
return c;
}
fn main() …Run Code Online (Sandbox Code Playgroud) u8在Rust中打印数组时,println!("{:?}", some_u8_slice);打印数值(应该如此).
在不假设任何特定编码的情况下,将字符格式化为字符串的最直接方法是什么.
像迭代字节字符串并将每个字符写入stdout (没有那么多麻烦)的东西.
可以使用Rusts来完成format!吗?
否则,打印u8切片最方便的方法是什么?
在Rust中,函数可能需要Into<String>:
fn get_by_key<S: Into<String>>(&self, key: S) -> Option<&Value>;
Run Code Online (Sandbox Code Playgroud)
是否可以传入对字符串的引用,因此String在将函数传递给函数时不需要克隆(使用类似的东西Into<&String>>)?