- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个结构被视为 16 个无符号整数的数组,并且传递 CreditCard
类型将是透明的,因为我将传递一个 16 个无符号整数的数组。
如何使这段代码按照设计的方式工作?
use std::fmt;
/// Credit Card type
#[repr(transparent)]
pub struct CreditCard([u8; 16]);
impl fmt::Display for CreditCard {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{}{}{}{}-{}{}{}{}-{}{}{}{}-{}{}{}{}",
self[0],
self[1],
self[2],
self[3],
self[4],
self[5],
self[6],
self[7],
self[8],
self[9],
self[10],
self[11],
self[12],
self[13],
self[14],
self[15]
)
}
}
fn process_cc(card: CreditCard) {
// do whatever
println!("processed CC {}", card);
}
fn main() {
let cc: CreditCard = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4];
println!("cc = {}", cc);
let card_data: [u8; 16] = [1, 2, 3, 4, 2, 2, 2, 2, 9, 8, 7, 6, 5, 5, 5, 5];
process_cc(card_data);
}
error[E0608]: cannot index into a value of type `&CreditCard`
--> src/main.rs:11:13
|
11 | self[0],
| ^^^^^^^
...
error[E0308]: mismatched types
--> src/main.rs:38:16
|
38 | process_cc(card_data);
| ^^^^^^^^^ expected struct `CreditCard`, found array of 16 elements
|
= note: expected type `CreditCard`
found type `[u8; 16]`
最佳答案
根本不是 repr(transparent)
的目的。坦率地说,我很困惑你发现了这样一个小众功能却没有阅读 the documentation for it :
Structs with this representation have the same layout and ABI as the single non-zero sized field.
这与类型在类型系统中的行为方式无关,仅与类型值的内存结构方式有关。
你想做的事情甚至不属于强类型语言。您不能只是将数组分配给另一种类型,因为它是另一种类型。使用 repr(transparent)
,将位从一个位转换为另一个位是有效的,但这永远不会自动发生。
更好的选择是为你的类型实现Deref
和From
:
use std::ops::Deref;
impl Deref for CreditCard {
type Target = [u8; 16];
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl From<[u8; 16]> for CreditCard {
fn from(other: [u8; 16]) -> Self {
CreditCard(other)
}
}
然后取任何可以变成CreditCard
的类型:
fn process_cc(card: impl Into<CreditCard>) {
// do whatever
println!("processed CC {}", card.into());
}
另见:
如果您执意要使用 repr(transparent)
,则需要执行以下操作:
fn process_cc(card: [u8; 16]) {
use std::mem;
let card: CreditCard = unsafe { mem::transmute(card) };
// do whatever
println!("processed CC {}", card);
}
这通常是一个非常糟糕的主意,您很可能不应该这样做。
关于rust - repr(transparent) 不允许将包含数组的结构视为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590513/
在交互式 Python 提示符上,当我没有将表达式 foo 的输出绑定(bind)到名称时,Python 将写入 builtins.repr(foo) 的输出> 到终端。 在较新版本的 Python
我目前正在编写一个 Vulkan 渲染器,我刚刚意识到我应该只接受 repr(C) 类型,但据我所知,没有办法在编译时实际检查它。 struct Vertex { x: f32, y:
是否有等效的 Pythons repr Scala 中的函数? 即一个函数,你可以给任何 scala 对象,它会产生一个有效的 scala 代码的对象的字符串表示。 例如: val l = List(
需要字符串在打印输出中显示 \n,且不带尾随 + 前导 '。目前在输入上使用repr(打开+读取.txt),所以我想知道删除'以进行正确索引/搜索的最佳方法是什么? repr('s')[1:-1] r
我想使用 repr() 获取 Python 编码的字符串文字(我可以将其粘贴到某些源代码中),但我更喜欢带有真正换行符的三引号字符串比 \n 转义序列。 我可以对字符串进行后处理,将 \n 转换回换行
我正在用 Python 处理一些文本解析,为此,对我要解析的每个字符串应用 repr() 函数对我来说很好,但在解析之后,我需要将一些已解析的子字符串转换回来到以前的表示,因为我想打印它们但我无法做到
所以我有一门类(class),我设置了类似的内容 class Piece: def __init__(): self.txt = "\u2665" # some met
作为Python 2 documentation on __repr__ 状态: If at all possible, this (i.e. __repr__) should look like a
我一直在阅读 repr在 Python 中。我想知道 repr 输出的应用程序是什么是。例如 class A: pass repr(A) ='' b=A() repr(b) = '' 什么时候会对
我正在使用一个小的 Python 脚本来生成一些将在 C 头文件中使用的二进制数据。 此数据应声明为 char[],如果可以将其编码为字符串(当它们不在 ASCII 可打印范围内时使用相关的转义序列)
在python中,repr和反引号`(1的左边)有区别吗? 用于演示: class A(object): def __repr__(self): return 'repr A'
我有一个节点类以十六进制和 HSV 形式保存 RGB 数据。我将使用它以各种方式对颜色进行排序,并且希望 HSV 元组保持浮点形式以进行比较,而不是每次使用都从字符串转换。有没有一种方法可以指定数据类
a = b'\x00\x01' ra = repr(a) # ra == "b'\\x00\\x01'" assert invert_repr(ra) == a invert_repr 的正确形式
我需要一个结构被视为 16 个无符号整数的数组,并且传递 CreditCard 类型将是透明的,因为我将传递一个 16 个无符号整数的数组。 如何使这段代码按照设计的方式工作? use std::fm
我有这个 C 代码: typedef void (*f_t)(int a); struct Foo { f_t f; }; extern void f(struct Foo *); b
我有一个结构: struct A { names: Vec, } 还有另一个结构: #[repr(C)] struct B { pub a: A, } 这是否使 A 也具有 repr(
除最后一部分外,我的代码运行完美。我想用 repr 函数重新创建对象,但它显然不起作用。我在这里和网上都试过了,但我还是很困惑。有什么方法可以做到吗?如果可以,语法是什么? class Modulo(
这个问题在这里已经有了答案: Convert "\x" escaped string into readable string in python (4 个答案) 关闭 7 个月前。 我有这个 st
我想要一种简单的方法来获取 repr() 之类的字典字符串按键排序。 my_print(dict(a=1, b=2, c=3)) -> "{'a': 1, 'b': 2, 'c': 3}" 我的解决方
我正在尝试在 Java 中完全模拟 Python 的 repr;这包括尽可能使用单引号。 Python 使用什么方法来确定它应该发出哪种引号? 编辑:我正在寻找一些实际代码,位于 Python 网络中
我是一名优秀的程序员,十分优秀!