问题标签 [structural-typing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
173 浏览

pointers - GO - 隐式方法如何工作?

在 GO 中,我了解到,

1)

程序员只能在命名类型(X)或指向*X命名类型的指针()上定义方法

2)

type 的显式方法定义X隐式定义 type 的相同方法,*X反之亦然所以,我的理解是,如果我声明,

并声明,

然后GO编译器给出,

Compile error: method re-declared

这表明,指针方法是隐式定义的,反之亦然


使用给定的命名类型(Cat),


方案 1

Method( )由程序员foo在命名类型( ) 上定义,Cat

fooGO 编译器在指针()上隐式定义方法(*Cat)到命名类型,看起来像,

关于创建命名类型(Cat)的变量

c.foo()有程序员定义的方法。

问题一:

在调用p.foo()时,隐式指针方法是否接收到指针(p)?


方案 2

程序员在指向命名类型foo的指针()上定义的方法( ),*Cat

foo由 GO 编译器在命名类型()上隐式定义方法( ) Cat,看起来像,

关于创建命名类型(Cat)的变量

p.foo()有程序员定义的方法(上图)。

问题2:

调用c.foo()时,隐式非指针方法是否接收值c

0 投票
4 回答
1064 浏览

go - 为什么隐式非指针方法不满足接口?

假设我们有一个理解,

对于 type 的显式方法定义X,GO 编译器为 type 隐式定义相同的方法,*X反之亦然如果我声明,

并声明,

然后 GO 编译器给出错误,

这表明,指针方法是隐式定义的,反之亦然


在下面的代码中,


GO 编译器报错,

at x = c,因为隐式指针方法满足接口,但隐式非指针方法不满足。

问题:

为什么隐式非指针方法不满足接口?

0 投票
1 回答
82 浏览

scala - close方法的编译时结构类型

我的项目中有以下辅助方法:

我有一些类有一个 close 方法但没有实现 Closeable。如果我将辅助方法更改为使用结构类型,我仍然可以在这些类上使用它:

然而,这引入了反射的使用,这是我想在运行时避免的。

有没有办法在不引起运行时反射的情况下使用类似于结构类型的东西?

即以同样的方式Shapeless允许对字段进行通用访问,也许隐式参数+宏可以用于以相同的方式访问方法?

0 投票
1 回答
383 浏览

scala - Apply 类型中使用的方法 [Scala]

我正在浏览 Scala 代码,发现 apply 方法也用于type.

例子:

上面的代码是什么意思?

据我了解,这意味着 Common 是指包含 apply 方法的所有类型。但是,问题是这意味着什么样的应用方法?apply 方法的输入应该是什么?

还,

两种Common类型有什么区别?

0 投票
2 回答
103 浏览

typescript - 用于捕获具有任意数量值的对象的 TypeScript 接口

我有一个这样的对象:

我可以编写一个 TypeScript 接口来描述这种类型吗?

0 投票
1 回答
60 浏览

scala - 反映 Java 静态方法的结构类型

给定带有调用的第三方 Java 库

我可以定义一个结构类型来表示这个吗?下面的类型不匹配,因为它没有捕获静态性质。

当然,我总是可以将这个调用包装在其他东西中,这就是我在必要时会做的事情。但是,是否有一种语法可以定义此方法的类型?

0 投票
2 回答
147 浏览

scala - 在 Scala 中使用结构类型发生 NoSuchMethodException

我正在编写一个带有三个参数的函数f, from, tof应该是任何具有apply消耗和产生 Int 的方法的对象。

我在这里使用结构类型来保证fapply()方法。

当我使用 调用该方法printValues()Array[Int],一切顺利。

我尝试使用 lambda 表达式调用该方法,结果一团糟

错误信息

我尝试验证对象lambdaxxx是否具有功能apply(在 Scala REPL 中)

我收到了两个错误报告:

看似使用结构类型

一个更奇怪的错误演示

所以也许我也落入了这个陷阱。

顺便说一句,如果printValues()在下面,则 lambda 表达式可以适合方法printValues2()

感谢您分享您的想法,祝您好运。

0 投票
2 回答
1976 浏览

javascript - 使用类和接口有什么区别?

这样做有什么区别

和这个

关于声明可观察类型

0 投票
1 回答
91 浏览

javascript - 流的结构子类型是否“忘记”特定的子类型属性?

我目前正在研究结构类型。我怀疑两种类型被认为是等价的,因为它们碰巧有一部分结构是相同的。这感觉很像静态鸭子类型,它完全忽略了类型的语义级别。于是仔细看了一下flow对普通对象的结构类型化,遇到了如下行为:

{}是结构类型,是所有普通对象的超类型。o因此,我可以用它进行注释是有道理的,因为它{foo: true}{}. 但是,当我尝试访问现有foo属性时,此操作不会键入检查。这很奇怪,因为 AFAIK 结构子类型通常可以包含特定属性,只要它还包括其超类型的所有必需属性。

似乎流的结构子类型算法偶尔会忘记特定于某个子类型的属性。这种行为是有意的还是我只是遇到了边缘情况?

0 投票
1 回答
166 浏览

javascript - 流的信息丢失是否与这种多态性固有的结构子类型相关?

流中的结构子类型化可能会导致信息丢失:

(这段代码很糟糕,因为它执行可见的突变。它仅用于说明目的。)

我已经读过行多态性是一个在不危及类型安全的情况下避免这种信息丢失的概念。

有没有办法通过亚型多态性实现相同的目标?

[编辑]

为了让更多的观众看到,我对这个有点吓人的术语做一个简短的解释:

  • Polymorphishm只是一个花哨的词,用于确定两种类型是否等价,即它使刚性类型系统更加灵活
  • 参数多态性(流中的泛型)表明两种类型总是等价的,因为类型根本不重要
  • 子类型多态性(流中的子类型)表明,如果您可以从中派生层次结构,则两种类型是等价的,即将子类型包含在其超类型下
  • 行多态性类似于子类型,但解决了信息丢失问题(但是从技术上讲,不再存在子类型关系,因此它不是子类型的一种形式)
  • 有界多态性表明两种类型仅在特定目的下是等价的,例如相等、顺序、映射等。