在Rust 1.27.0中引入了一种新语法 - dyn
添加了关键字.
// old => new
Box<Foo> => Box<dyn Foo>
&Foo => &dyn Foo
&mut Foo => &mut dyn Foo
Run Code Online (Sandbox Code Playgroud)
它实际上做了什么以及它为什么被添加?
我想从可执行文件所在目录的 config 文件夹中读取文件。我使用以下功能来做到这一点:
use std::env;
// add part of path to te path gotten from fn get_exe_path();
fn get_file_path(path_to_file: &str) -> PathBuf {
let final_path = match get_exe_path() {
Ok(mut path) => {
path.push(path_to_file);
path
}
Err(err) => panic!("Path does not exists"),
};
final_path
}
// Get path to current executable
fn get_exe_path() -> Result<PathBuf, io::Error> {
//std::env::current_exe()
env::current_exe()
}
Run Code Online (Sandbox Code Playgroud)
就我而言,get_exe_path()
将返回C:\Users\User\Documents\Rust\Hangman\target\debug\Hangman.exe
。
随着get_file_path("Config\test.txt")
,我想附加Config\test.txt
到上述路径。然后我得到文件的以下路径:C:\Users\User\Documents\Rust\Hangman\target\debug\Hangman.exe\Config\test.txt
问题是它std::env::current_exe()
也会获得可执行文件的文件名,而我不需要那个。我只需要它所在的目录。
题
以下函数调用应返回C:\Users\User\Documents\Rust\Hangman\target\debug\Config\test.txt
:
let path …
Run Code Online (Sandbox Code Playgroud) 我使用可序列化和反序列化的泛型。但是,派生属性上存在错误,Deserialize
表明无法推断类型。
结构体和枚举都会引发编译错误。评论其中之一不会解决任何问题。
use serde::{Deserialize, Serialize}; // 1.0.104
#[derive(Serialize, Deserialize)]
struct Jhon<A>
where
A: Serialize + for<'a> Deserialize<'a>,
{
foo: Foo<A>,
}
#[derive(Serialize, Deserialize)]
enum Foo<A>
where
A: Serialize + for<'a> Deserialize<'a>,
{
A,
B(A),
}
Run Code Online (Sandbox Code Playgroud)
use serde::{Deserialize, Serialize}; // 1.0.104
#[derive(Serialize, Deserialize)]
struct Jhon<A>
where
A: Serialize + for<'a> Deserialize<'a>,
{
foo: Foo<A>,
}
#[derive(Serialize, Deserialize)]
enum Foo<A>
where
A: Serialize + for<'a> Deserialize<'a>,
{
A,
B(A),
}
Run Code Online (Sandbox Code Playgroud)
我正在制作一个跨平台终端库.因为我的库改变了终端的状态,所以我需要恢复进程结束时对终端所做的所有更改.我现在正在实现此功能,并思考如何在最后恢复到原始终端状态的方法.
我认为在程序启动时初始化静态变量,并且当程序结束时,这个静态变量将被销毁.由于我的静态变量是一个已经实现了Drop
特征的结构,它将在程序结束时被删除,但事实并非如此,因为字符串"drop called"从不打印:
static mut SOME_STATIC_VARIABLE: SomeStruct = SomeStruct { some_value: None };
struct SomeStruct {
pub some_value: Option<i32>,
}
impl Drop for SomeStruct {
fn drop(&mut self) {
println!("drop called");
}
}
Run Code Online (Sandbox Code Playgroud)
drop()
程序结束时为什么不调用?我的想法是错的,我应该采取另一种方式吗?
对于一个项目,我使用 swagger hub 来构建我的 API。我从 swagger hub 生成服务器代码。但是,当生成此代码时,它具有同步控制器。有没有办法在 swagger.yml 中指定生成异步控制器而不是同步控制器?
生成:
public virtual IActionResult GetUserById([FromRoute][Required]string userId) { }
Run Code Online (Sandbox Code Playgroud)
应该
public virtual Task<IActionResult> GetUserById([FromRoute][Required]string userId) { }
Run Code Online (Sandbox Code Playgroud) 情况
我有一个SQL脚本,我需要将一些基本数据推送到我的数据库.因此,我使用以下脚本(和其他).我想手动为我手动创建的行提供主键.
问题
如果我执行脚本,它会说我需要启用IDENTITY_INSERT.我添加了这一行SET IDENTITY_INSERT UserGroups ON;
尽可能多的例子,但是当我添加它时它仍然会给出相同的错误.
SET IDENTITY_INSERT UserGroups ON;
GO
INSERT INTO UserGroups VALUES (0, 0);
Run Code Online (Sandbox Code Playgroud)
运行脚本时出错:
只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'UserGroups'中标识列的显式值.
题
我是否还需要在数据库中更改某些内容,或者在脚本中是否还有其他内容可以手动添加主键?
细节
我使用SQL Server 2016 Management Studio.
我使用DDL Script for SQL脚本
我使用Entity Framework.
我在这张表中有两列
c# database sql-server sql-scripts management-studio-express
我想在包含时间序列数据的特定表上使用TimescaleDB 。我的问题是如何从实体框架核心设置时间序列并使特定表成为超级表?
数据库:Postgress 版本 11 框架:Ef Core 2.2 方法:Code First
为什么我可以在同一范围内对静态类型进行多次可变引用?
我的代码:
static mut CURSOR: Option<B> = None;
struct B {
pub field: u16,
}
impl B {
pub fn new(value: u16) -> B {
B { field: value }
}
}
struct A;
impl A {
pub fn get_b(&mut self) -> &'static mut B {
unsafe {
match CURSOR {
Some(ref mut cursor) => cursor,
None => {
CURSOR= Some(B::new(10));
self.get_b()
}
}
}
}
}
fn main() {
// first creation of A, get a mutable reference …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用winapi和kernel32条板箱使用Rust更改Windows控制台的前景色。
[dependencies]
winapi = "0.2.8"
kernel32-sys = "0.2.1"
Run Code Online (Sandbox Code Playgroud)
码
我存储前景色值的枚举:
#[repr(u16)]
pub enum ForegroundColor {
RED = (winapi::FOREGROUND_INTENSITY | winapi::FOREGROUND_RED) as u16,
CYAN = (winapi::FOREGROUND_INTENSITY | winapi::FOREGROUND_GREEN | winapi::FOREGROUND_BLUE) as u16,
// ...
}
Run Code Online (Sandbox Code Playgroud)
获取输出句柄的函数:
use winapi;
use winapi::{CONSOLE_SCREEN_BUFFER_INFO, COORD, HANDLE, SMALL_RECT, WORD};
use kernel32;
static mut CONSOLE_OUTPUT_HANDLE: Option<HANDLE> = None;
pub fn get_output_handle() -> HANDLE {
unsafe {
if let Some(handle) = CONSOLE_OUTPUT_HANDLE {
handle_check(handle);
handle
} else {
let handle = kernel32::GetStdHandle(winapi::STD_OUTPUT_HANDLE);
handle_check(handle);
CONSOLE_OUTPUT_HANDLE = Some(handle);
handle
} …
Run Code Online (Sandbox Code Playgroud) rust ×6
c# ×2
static ×2
asp.net-core ×1
asynchronous ×1
colors ×1
console ×1
database ×1
destroy ×1
directory ×1
ef-core-2.2 ×1
file ×1
kernel32 ×1
keyword ×1
lifetime ×1
path ×1
postgresql ×1
sql-scripts ×1
sql-server ×1
swagger ×1
syntax ×1
timescaledb ×1
winapi ×1