gpt4 book ai didi

f# - 让 WebSharper 生成简单的字段访问

转载 作者:行者123 更新时间:2023-12-01 01:10:26 25 4
gpt4 key购买 nike

我需要一个将被转换为普通 JS 对象的类型,以便 F# 字段访问将被转换为简单的 JS 字段访问(这是必需的,因为对象将通过 postMessage 发送,所以它会失去所有的方法)。

再一次,我需要

let x = a.b

翻译成

var x = a.b;

没有任何方法调用。

这是 F# 引用中的一个稍微修改过的示例:

namespace T

open IntelliFactory.WebSharper

[<JavaScript>]
module A =
type MyClass =
val a : int
val b : int
new(a0, b0) = { a = a0; b = b0; }

let myClassObj = new MyClass(35, 22)
let x = myClassObj.b

这不会翻译

x: error : Failed to translate property access: b.'

好吧,让我们让那些 val 可变:

namespace T

open IntelliFactory.WebSharper

[<JavaScript>]
module A =
type MyClass =
val mutable a : int
val mutable b : int
new(a0, b0) = { a = a0; b = b0; }

let myClassObj = new MyClass(35, 22)
let x = myClassObj.b

这将被成功翻译,但是...... MyClass.New 返回一个空对象。这个问题现在开始看起来很像错误报告,对吧?那么,回到问题。

还有其他方法可以实现我想要的吗?

最佳答案

记录式构造函数“{x = y}”还有其他问题。我将不得不在 F# 3.0 上再次研究这个问题,较旧的 F# 没有为这些生成合理的引用,我们在 WebSharper 中做了一些部分解决方法。现在你的例子坏了。所以这里是使用静态方法而不是构造函数的工作代码:

type MyClass private () =

[<DefaultValue>]
val mutable a : int

[<DefaultValue>]
val mutable b : int

static member Create(a0, b0) =
let c = MyClass()
c.a <- a0
c.b <- b0
c

let test () =
let myClassObj = MyClass.Create(35, 22)
let x = myClassObj.a
let y = myClassObj.b
JavaScript.Log(x, y)

通常,记录也可以。

在某些情况下,如果您想真正做到低级别,可以使用 Inline 属性对成员进行注释。如果开销太大,您可以使用非类型化 API:

let x = obj ()
x?a <- 1
let y = x?a
JavaScript.Log(x, y)

关于f# - 让 WebSharper 生成简单的字段访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16035713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com