TLDR:我想用我从旧的构建的新的替换T后面&mut TTT
注意:如果这个问题的解决方案很容易找到,请原谅我。我做了很多谷歌搜索,但我不确定如何正确地表达问题。
示例代码(游乐场):
struct T { s: String }
fn main() {
let ref mut t = T { s: "hello".to_string() };
*t = T {
s: t.s + " world"
}
}
Run Code Online (Sandbox Code Playgroud)
这显然会失败,因为 add impl 是按值String获取的self,因此需要能够移出T,但这是不可能的,因为T位于引用后面。
据我所知,实现这一目标的通常方法是做类似的事情
let old_t = std::mem::replace(t, T { s: Default::default() });
t.s = old_t + " world";
Run Code Online (Sandbox Code Playgroud)
但这要求创建一些占位符是可能且可行的,T直到我们可以用真实数据填充它为止。
幸运的是,在我的用例中,我可以创建一个占位符T,但我仍然不清楚为什么与此类似的 api 不可能:
map_in_place(t, |old_t: T| …Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
function alrtHtml() {
alert(this.innerHTML)
}
function myFunc(id) {
document.getElementById(id).alrtHtml()
}Run Code Online (Sandbox Code Playgroud)
<html>
<head>
<meta charset="UTF-8" />
<title>test</title>
</head>
<body>
<h1 id="h1">Hello world!</h1>
<input type="button" value="click" onclick="myFunc('h1')" >
</body>
</html>Run Code Online (Sandbox Code Playgroud)
结果应该是带有文本“Hello world!”的警报。内部h1标签。
我的目标是能够在不显式将元素作为参数传递给alertHtml.
根据这个答案:
使用
void代替意味着 forEach 承诺不使用返回值,因此可以使用返回任何值的回调调用它
...
unknown是any. 任何东西都可以分配给unknown,但unknown不能分配给任何东西,但它本身和any......
尽管我这么想,但从这些描述中我找不到这些类型之间的任何区别。
我还注意到,与unknown, whenvoid用作函数参数的类型不同,调用函数时可以省略该参数,即使它没有标记为可选:
declare const x: (a: void) => void
x()
Run Code Online (Sandbox Code Playgroud)
虽然这种行为在处理通用代码时有时很有用,但它看起来很奇怪。ifvoid应该只在返回类型中使用,为什么它有这种特殊的行为,与其他类型不同?
最近我遇到了一个问题,我有一个函数必须返回一个Is数组,以 enum 的所有值的形式E,E实现 interface I,我想到的每个代码编译器都抱怨类型不匹配:
Error:(x, x) Kotlin: Type mismatch: inferred type is Array<E> but Array<I> was expected
Run Code Online (Sandbox Code Playgroud)
一个最小的例子:
interface I {}
enum class E: I {
A, B, C;
}
fun getMoreInterfaces(): Array<I> {
return E.values()
}
Run Code Online (Sandbox Code Playgroud)
当尝试分配E.values()给类型的变量时会发生这种情况,Array<I>
我很确定这应该是可能的,因为E实现了I.
我在测试时想到的另一件事是,像这样使用时它工作得很好:
interface I {}
enum class E: I {
A, B, C;
}
fun getMoreInterfaces(): Array<I> {
return arrayOf(E.A, E.B, E.C)
}
Run Code Online (Sandbox Code Playgroud)
我在这个主题上做了很多搜索,但没有运气(也许我选择了错误的描述方式?)
我正在为antlr构建从CST到AST的映射器,因此*Context我需要映射到它们的核心AST节点。我有ANTLR生产的类和我的映射器方法:
// Demo data:
open class Super
class Sub0: Super
class Sub1: Super
// Mappers:
fun map(a: Super) = println("Super")
fun map(a: Sub0) = println("Sub0")
fun map(a: Sub1) = println("Sub1")
Run Code Online (Sandbox Code Playgroud)
然后,我想按以下方式使用它:
listOf(Super(), Sub0(), Sub1()).forEach {
when (it) {
is B, is C -> { print('*'); map(it) }
else -> map(it)
}
}
Run Code Online (Sandbox Code Playgroud)
我希望it将其智能广播到Sub0或Sub1并调用正确的map,但是给出:
Super
*Super
*Super
Run Code Online (Sandbox Code Playgroud)
这表明它选择了正确的路径,但没有进行自动广播。这种方法行得通,但随着您拥有越来越多的,它会变得很长SubX:
when (it) {
is Sub0 -> {
print("*");
map(it)
}
is Sub1 -> {
print("*"); …Run Code Online (Sandbox Code Playgroud)