我希望能够定义一个特征,使得任何实现该特征的结构不仅必须实现函数,而且还必须指定某些常量的值。所以也许是这样的:
trait MyTrait {
const MY_CONST: u8;
fn foo();
fn bar();
}
Run Code Online (Sandbox Code Playgroud)
然后结构看起来像这样:
struct MyFirstStruct {
const MY_CONST: u8 = 42;
...
}
impl MyTrait for MyFirstStruct {
fn foo() {...}
fn bar() {...}
}
Run Code Online (Sandbox Code Playgroud)
这样,当我稍后实现 时MySecondStruct,MyThirdStruct它们可以分别具有不同的值MY_CONST,但每个实例都MyFirstStruct将具有相同的值MY_CONST,并且每个实例MySecondStruct也将具有相同的值MY_CONST(这可能与 的值不同,也可能不不同)MY_CONST为了MyFirstStruct)
这可能吗?
我已经尝试了在块中指定常量的各种组合impl MyTrait for MyFirstStruct,在块中指定它struct MyFirstTrait,但似乎无法弄清楚。
在线搜索似乎总是落在 rust book (它没有描述这样的东西)、rust by example、高级特征 rust book Chapter …
所以如果我有这样的文字:
if answer == 42 { #1
if bugs == 'bunny' { #2
if injury == 'but a scratch' { #3
// do the thing #4
} #5
} #6
} #7
Run Code Online (Sandbox Code Playgroud)
我将光标放在上面// do the thing并执行va{命令,然后我将从第 3 行到第 5 行中选择{},如果a{再次这样做,我将从第 2 行到第 6 行中选择{}。
但是哦,不,我现在意识到我实际上只想选择{}第 3 行到第 5 行。令我恐惧的是,通常的 vim 方法capitalisation => opposite不起作用,A{只是将 a 附加{到行尾。
我可以从一个大的选择转到一个较小的选择,而不取消选择、移动光标并重新进行吗?hjklwbeo在此示例中,使用其中的一些手动更改选择也很简单,但实际上代码块很长且不平凡。
我知道,如果一个父块中有多个兄弟块,那么这将是不明确的,但我很乐意只选择第一个,因为这种情况很少发生在我身上。
谢谢!
编辑:执行此操作的插件将是一个不错的选择。如果看起来不存在,那么我将制作一个快速 MVP …
在 python 中,我可以在=格式化参数后包含一个来打印变量的值以及变量名称:
var = 10
f"{var=}" # -> "var=10"
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Rust 中使用format!()宏来做到这一点?我知道 dbg!宏,但该字符串将显示进度条和 dbg!不返回字符串。
我想要类似format!("{var:=}")或也许的东西format!("{var=}"),但这些都不起作用。
澄清一下,我不想输入变量名称,但仍将其打印出来。例如,如果我打印一长行变量,例如:
println!("variable1={variable1}, variable2={variable2}, variable3={variable3}, variable4={variable4}");
Run Code Online (Sandbox Code Playgroud)
显式写出变量名称很快就会过时,如果我重命名该变量,那么 rust-analyzer 不会拾取该字符串,并且会给我留下类似"old_name={new_name}".
这是一件小事,但我发现f"{var1=}"在 python 中非常有用。
我已经尝试了一些可以在网上找到的方法来将当前时间打印为 ISO8601 字符串,但没有一个起作用:
\n这个答案假设您已经知道如何获取当前时间,但我无法弄清楚。
\n我不断收到错误,Could not find module \xe2\x80\x98System.Locale\xe2\x80\x99因为它似乎System.Locale已被弃用/默认情况下不再安装?
我尝试安装old-local,但这给了我新的错误,我认为是由于time和 之间的不兼容造成的old-locale:
\xe2\x80\xa2 Couldn\'t match expected type \xe2\x80\x98time-1.9.3:Data.Time.Format.Locale.TimeLocale\xe2\x80\x99\n with actual type \xe2\x80\x98System.Locale.TimeLocale\xe2\x80\x99\n NB: \xe2\x80\x98time-1.9.3:Data.Time.Format.Locale.TimeLocale\xe2\x80\x99\n is defined in \xe2\x80\x98Data.Time.Format.Locale\xe2\x80\x99 in package \xe2\x80\x98time-1.9.3\xe2\x80\x99\n \xe2\x80\x98System.Locale.TimeLocale\xe2\x80\x99\n is defined in \xe2\x80\x98System.Locale\xe2\x80\x99 in package \xe2\x80\x98old-locale-1.0.0.7\xe2\x80\x99\n\xe2\x80\xa2 In the first argument of \xe2\x80\x98formatTime\xe2\x80\x99, namely \xe2\x80\x98defaultTimeLocale\xe2\x80\x99\n In the expression: formatTime defaultTimeLocale "%FT%T%QZ"\n In an equation for \xe2\x80\x98iso8601\xe2\x80\x99:\n iso8601 = formatTime defaultTimeLocale "%FT%T%QZ"\n …Run Code Online (Sandbox Code Playgroud)通常,如果我有一个像points.length - 1and 这样的代码表达式,我想用一个变量替换它(例如,命名,target_idx那么我将定义该变量:
int target_idx = points.length - 1;
Run Code Online (Sandbox Code Playgroud)
但现在我想用 替换所有points.length - 1实例target_idx。我知道我可以这样做:%s/points.length - 1/target_idx/g,但我对我的正则表达式不太有信心,并且不想错误地替换points.length - 11或points+length - 1错误地替换。(我也知道非常神奇的搜索,但对它考虑/不考虑特殊字符的所有微妙之处也不是很有信心)
所以我想要的是能够搜索与points.length - 1via匹配的实例/points.length - 1,然后使用 遍历搜索结果n,然后将文本替换为target_idx。
但由于搜索的文本可能包含空格或其他字符,因此我不能简单地更改为单词的末尾,cE因为这只会points.length在我的示例中发生变化。
是否存在到达搜索文本末尾的文本动作?
这样我就可以走了
nc<special text motion here>target_idx我正在使用安装了 CoC 的 neovim,因此我对插件或语言服务器替换的更深入的想法持开放态度,但这感觉应该是一个我只是不知道的简单文本动作。