小编Fra*_*lik的帖子

通过移动和映射原始值来替换可变引用后面的值

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)

rust

8
推荐指数
1
解决办法
1317
查看次数

如何在 DOM 节点上使用“this”调用自己的方法

我想做这样的事情:

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.

javascript

5
推荐指数
1
解决办法
214
查看次数

`unknown` 和 `void` 之间的区别

根据这个答案

使用void代替意味着 forEach 承诺不使用返回值,因此可以使用返回任何值的回调调用它

根据TypeScript 3.0 发行说明

...unknownany. 任何东西都可以分配给unknown,但unknown不能分配给任何东西,但它本身和any......

尽管我这么想,但从这些描述中我找不到这些类型之间的任何区别。

我还注意到,与unknown, whenvoid用作函数参数的类型不同,调用函数时可以省略该参数,即使它没有标记为可选:

declare const x: (a: void) => void

x()
Run Code Online (Sandbox Code Playgroud)

操场

虽然这种行为在处理通用代码时有时很有用,但它看起来很奇怪。ifvoid应该只在返回类型中使用,为什么它有这种特殊的行为,与其他类型不同?

typescript typescript3.0

4
推荐指数
1
解决办法
339
查看次数

Kotlin:如果 E 是实现接口 I 的枚举类,则从返回类型为 Array&lt;I&gt; 的函数中返回 Array&lt;E&gt;

最近我遇到了一个问题,我有一个函数必须返回一个Is数组,以 enum 的所有值的形式EE实现 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)

我在这个主题上做了很多搜索,但没有运气(也许我选择了错误的描述方式?)

enums type-mismatch generic-variance kotlin

3
推荐指数
1
解决办法
4798
查看次数

Kotlin:多种类型的智能投射

我正在为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)

kotlin

3
推荐指数
1
解决办法
111
查看次数