我正在使用 jwt 为我的 API 开发身份验证系统,并且有以下两种类型:
#[derive(Serialize, Deserialize)]
pub struct UserClaims {
email: String,
exp: usize,
sub: String,
}
#[derive(Serialize)]
struct AccessToken(String);
Run Code Online (Sandbox Code Playgroud)
现在我想表达这样一个事实:访问令牌可以“转换”为声明对象。所以我决定实施以下措施:
impl From<AccessToken> for UserClaims {
fn from(token: AccessToken) -> Self {
// ... NOTE: this is fallible i.e actually returns a `Result`
}
}
Run Code Online (Sandbox Code Playgroud)
但我意识到解码令牌的代码是错误的并返回 a Result,现在我可以将impl块更改为类似以下内容:impl Into<Result<UserClaims, SomeError>> for AccessToken但这是这些特征的惯用用法吗?或者如果我只使用常规方法会更好吗?
更新到 Dotnet Core 3.1 并移植我的代码,我发现在 DbContext 中出现以下错误:
“PropertyBuilder”不包含“HasDefaultValue”的定义,并且找不到接受“PropertyBuilder”类型的第一个参数的可访问扩展方法“HasDefaultValue”(您是否缺少 using 指令或程序集引用?)
我发生这种情况的代码如下:
modelBuilder.Entity<Tenant>().Property(t => t.TenantNo).HasMaxLength(20);
modelBuilder.Entity<Tenant>().Property(t => t.CompanyName).HasMaxLength(100).IsRequired();
modelBuilder.Entity<Tenant>().Property(t => t.ContactLastName).HasDefaultValue(false).IsRequired();
modelBuilder.Entity<Tenant>().Property(t => t.Email).HasMaxLength(500).IsRequired();
modelBuilder.Entity<Tenant>().Property(t => t.MobilePhone).HasMaxLength(20).IsRequired();
modelBuilder.Entity<Tenant>().Property(t => t.OfficePhone).HasMaxLength(20);
modelBuilder.Entity<Tenant>().Property(t => t.CompanyEmail).HasMaxLength(500);
modelBuilder.Entity<Tenant>().Property(t => t.Address1).HasMaxLength(500);
modelBuilder.Entity<Tenant>().Property(t => t.Address2).HasMaxLength(500);
modelBuilder.Entity<Tenant>().Property(t => t.ABN).HasMaxLength(14);
modelBuilder.Entity<Tenant>().Property(t => t.Database).HasMaxLength(100).IsRequired();
modelBuilder.Entity<Tenant>().Property(t => t.IsLocked).HasDefaultValue(false);
Run Code Online (Sandbox Code Playgroud)
我在哪里使用过 .HasDefaultValue 我收到这个错误。我相信,我拥有所有必需的指令......
using JobsLedger.CATALOG.Entities;
using Microsoft.EntityFrameworkCore;
using System.Threading;
using System.Threading.Tasks;
Run Code Online (Sandbox Code Playgroud)
似乎在从 3.0 升级到 3.1 时,他们错过了这一点,或者他们正在使用不同的方式设置默认值。
所以在我发布这个之前,我确实做了一个谷歌搜索和一个 Stackoverflow 搜索,但没有结果。
想知道有人可能会建议如何在 3.1 中设置默认值?
我是 Rust 的初学者。我看到pop()向量返回<Option>类型的方法。获取pop()变量值的正确方法是什么?
let mut queue: Vec<[usize; 2]> = Vec::new();
queue.push([1, 2]);
queue.push([3, 4]);
let coords = queue.pop();
println!("{}, {}", coords[0], coords[1]);
Run Code Online (Sandbox Code Playgroud)
error[E0608]: cannot index into a value of type `std::option::Option<[usize; 2]>`
--> src/main.rs:99:24
|
99 | println!("{}, {}", coords[0], coords[1]);
|
Run Code Online (Sandbox Code Playgroud) 我想将特定类型返回到泛型类型,都是内置类型,所以不能 impl From for u32 { ... }
fn fn1<T>() -> T {
let a = 123u64;
a as T
// ^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object
}
fn main() {
let a = fn1::<u32>();
dbg!(a);
}
Run Code Online (Sandbox Code Playgroud)
有什么好办法吗?
我希望能够获取一个字符串并调用它的方法,如下所示:
let s = String::new();
s.clean()
Run Code Online (Sandbox Code Playgroud)
我想我应该把它作为字符串的一个特征来实现,所以开始写这个:
trait Clean {
fn clean(&mut self) -> Self {
return self.trim_start_matches("\"");
}
}
impl Clean for String {}
Run Code Online (Sandbox Code Playgroud)
这至少有两个问题:
.trim_start_matches()方法 - 所以 Rust 不会编译。.trim_start_matches(),我认为它不会就地变异,所以我认为将 .clean() 附加到末尾不会起作用(我必须创建一个新变量)实现这个的正确方法是什么?
抱歉,如果之前有人问过这个问题,我不知道该在搜索栏中输入什么来找到类似的答案。
在下面的代码中:
use std::env;
use serenity::{
async_trait,
model::{channel::Message, gateway::Ready},
prelude::*,
utils::MessageBuilder,
};
struct Handler;
use serenity::model::id::GuildId;
use serenity::model::voice::VoiceState;
#[async_trait]
impl EventHandler for Handler {
async fn voice_state_update(&self, context: Context, arg2 : Option<GuildId>, old : Option<VoiceState>, new : VoiceState) {
//async fn voice_state_update(&self, context: Context, arg2 : Option<GuildId>, new : VoiceState) {
}
}
#[tokio::main]
async fn main() {
// Configure the client with your Discord bot token in the environment.
let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment");
let mut …Run Code Online (Sandbox Code Playgroud) 我想在我的 Rust 程序中拥有一个静态 Uuid,但我不知道如何做到这一点。
我尝试过,但不起作用
fn type_id() -> &'static uuid::Uuid {
let tmp = "9cb4cf49-5c3d-4647-83b0-8f3515da7be1".as_bytes();
let tmp = uuid::Uuid::from_slice(tmp).unwrap();
&tmp
}
error: cannot return reference to local variable `tmp`
returns a reference to data owned by the current function (rustc E0515)
Run Code Online (Sandbox Code Playgroud) match该表达式是如何在高层次上实现的?编译器在幕后发生了什么才能知道如何将某些代码片段定向到一个分支与另一个分支,并在编译时弄清楚它?我不明白如果不存储运行时使用的类型信息,这怎么可能。
像这个例子:
\nfn tree_weight_v1(t: BinaryTree) -> i32 {\n match t {\n BinaryTree::Leaf(payload) => payload,\n BinaryTree::Node(left, payload, right) => {\n tree_weight_v1(*left) + payload + tree_weight_v1(*right)\n }\n }\n}\n\n/// Returns tree that Looks like:\n///\n/// +----(4)---+\n/// | |\n/// +-(2)-+ [5]\n/// | | \n/// [1] [3]\n///\nfn sample_tree() -> BinaryTree {\n let l1 = Box::new(BinaryTree::Leaf(1));\n let l3 = Box::new(BinaryTree::Leaf(3));\n let n2 = Box::new(BinaryTree::Node(l1, 2, l3));\n let l5 = Box::new(BinaryTree::Leaf(5));\n\n BinaryTree::Node(n2, 4, l5)\n}\n\n#[test]\nfn tree_demo_1() {\n let tree = sample_tree();\n assert_eq!(tree_weight_v1(tree), (1 …Run Code Online (Sandbox Code Playgroud) 有没有办法在 Rust 中将 HashMap 转换为 Vector,无需复制元素,即将数据从哈希映射移动到向量?通过使用 iter+map+collect 需要复制哈希映射的所有元素,这不是最佳的,因为哈希映射不被假定进一步使用。在 Option 的情况下,它工作得很好,因为数据会自动移动,我们可以使用 as_ref 来阻止它。
我必须复制所有元素的代码示例
use std::collections::HashMap;
#[derive(Clone, Hash, PartialEq, Eq, Debug)]
struct base1 {
x: i32,
}
#[derive(Clone, Debug)]
struct base2 {
x: i32,
}
#[derive(Debug)]
struct ss {
x: base1,
y: base2,
}
fn main() {
let mut map = HashMap::new();
map.insert(base1 { x: 13 }, base2 { x: 13 });
let vec: Vec<ss> = map
.iter()
.map(|x| ss {
x: x.0.clone(),
y: x.1.clone(),
})
.collect();
println!("Ma13: {:?}", vec);
}
Run Code Online (Sandbox Code Playgroud) 在 Rust 中寻找饱和函数。
这里我称之为fit_to_range(range)。
let input:i64= something;
let saturated:64= input.fit_to_range(7..=4000);
assert!((7..=4000).contains(saturated));
Run Code Online (Sandbox Code Playgroud) 我认为必须有一种动态的方式来执行以下操作。这里有一个隐含的问题,即如何动态创建原始值数组?请注意:我不需要向量。
let mut positional_frequencies: [[(u16, char); 26]; 5] = [
[(0, 'A'), (0, 'B'), (0, 'C'), (0, 'D'), (0, 'E'),
(0, 'F'), (0, 'G'), (0, 'H'), (0, 'I'), (0, 'J'),
(0, 'K'), (0, 'L'), (0, 'M'), (0, 'N'), (0, 'O'),
(0, 'P'), (0, 'Q'), (0, 'R'), (0, 'S'), (0, 'T'),
(0, 'U'), (0, 'V'), (0, 'W'), (0, 'X'), (0, 'Y'),
(0, 'Z')],
[(0, 'A'), (0, 'B'), (0, 'C'), (0, 'D'), (0, 'E'),
(0, 'F'), (0, 'G'), (0, 'H'), (0, 'I'), …Run Code Online (Sandbox Code Playgroud) 在 Rust 中,当函数返回具有单位类型的结果时,调用函数的最佳方式是什么?
例如,我有这个函数将一些文本复制到剪贴板:
use anyhow::Result;
use cli_clipboard::{ClipboardContext, ClipboardProvider};
fn copy_to_clipboard(text:&String) -> Result<()>{
let mut ctx = ClipboardContext::new()?;
ctx.set_contents(text.to_owned())?;
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
然后,当我调用这个函数时,我想这样做,但它会创建一个编译器警告“必须使用未使用的结果”:
copy_to_clipboard(selected_value);
Run Code Online (Sandbox Code Playgroud)
所以我最终使用以下内容来消除警告:
_ = copy_to_clipboard(selected_value);
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有更好/更惯用的方法来做到这一点?