问题标签 [duck-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 投票
3 回答
342 浏览

python - 模块“鸭子打字”的陷阱?

我刚刚开始尝试一种新技术,我将其命名为(至少目前)“模块鸭式打字”。

例子:

主模块

模块abc

在模块abc中我不需要明确import req:它可以在包层次结构中的任何地方。当然,这需要一些纪律...

使用这种技术,很容易在层次结构中重新定位包。

有陷阱在等着我吗?例如迁移到 Python 3K

更新:经过更多测试,我决定返回直接在sys.path.

0 投票
4 回答
1356 浏览

interface - 我应该用 Duck Typed 语言定义接口吗?

我正准备用鸭子类型语言 (Groovy) 编写我的第一个应用程序。

如果我要用静态类型语言编写相同的应用程序,那么我需要定义一些接口。显然,由于 Groovy 中的鸭子类型,它们实际上并不是必需的。目前,我认为将它们定义为需要在各种对象中实现的方法的文档可能是有意义的。我错过了重点吗?

0 投票
1 回答
381 浏览

coldfusion - ColdFusion 中的鸭子类型

什么是鸭式打字,ColdFusion 是如何相关的?

0 投票
3 回答
1369 浏览

c# - 最新的 C# Duck 类型库

4.0 版以下的 C# 的鸭子类型的当前最新技术是什么?

我知道Duck Typing Project,我知道BLTokit 对此有一些帮助,但我想知道除了 DLR 语言和 C# 4.0 之外,我是否遗漏了一些真正邪恶的东西。

0 投票
4 回答
2589 浏览

c# - C# 是否具有与 Scala 的结构类型等价的功能?

在 Scala 中,我可以如下定义结构类型:

type Pressable = { def press(): Unit }

这意味着我可以定义一个函数或方法,它以可按下的东西作为参数,如下所示:

def foo(i: Pressable) { // etc.

我传递给该函数的对象必须为它定义了一个名为 press() 的方法,该方法与类型中定义的类型签名相匹配 - 不接受任何参数,返回 Unit(Scala 的 void 版本)。

我什至可以使用内联结构类型:

def foo(i: { def press(): Unit }) { // etc.

它基本上允许程序员拥有鸭子类型的所有好处,同时仍然具有编译时类型检查的好处。

C#有类似的东西吗?我在 Google 上搜索过,但找不到任何东西,但我对 C# 并不熟悉。如果没有,有没有计划添加这个?

0 投票
3 回答
700 浏览

perl - 在鸭子类型语言中模拟静态类型的各个方面

在我目前的工作中,我正在构建一套严重依赖对象的 Perl 脚本。(在哈希上使用 Perlbless()以尽可能接近 OO)

现在,由于缺乏更好的表达方式,我公司的大多数程序员都不是很聪明。更糟糕的是,他们不喜欢阅读文档,而且似乎很难理解其他人的代码。牛仔编码是这里的游戏。每当他们遇到问题并试图解决它时,他们都会想出一个可怕的解决方案,但实际上什么也没解决,而且通常会使情况变得更糟。

坦率地说,这导致我不相信他们用鸭子类型语言编写的代码。举个例子,我看到太多的问题是他们没有因为滥用对象而没有得到明确的错误。例如,如果 typeA有 member foo,并且他们做了类似的事情instance->goo,他们不会立即看到问题。它将返回一个空值/未定义值,他们可能会浪费一个小时来寻找原因。然后最终更改其他内容,因为他们没有正确识别原始问题。

所以我正在集思广益,寻找一种方法来保留我的脚本语言(它的快速发展是一个优势),但在对象未正确使用时给出明确的错误消息。我意识到,由于没有编译阶段或静态类型,因此错误必须在运行时出现。我对此很好,只要用户得到一个非常明确的通知,说“这个对象没有 X”

作为我的解决方案的一部分,我不希望他们在尝试使用方法/变量之前检查它是否存在。

即使我的工作是在 Perl 中,我认为这可能与语言无关。

0 投票
4 回答
944 浏览

c++ - C++ 或任何其他语言中的可选结构类型的可能性?

在 C++ 中如何告诉编译器 Ogre::Vector3 IS_SAME_AS SomeOtherLIB::Vector3 ?我觉得..在像 c++ 这样不是结构类型的语言中,但在某些情况下它是有意义的。

通常作为游戏开发人员使用 4+ 提供排序或他们自己的 Vector3 实现的库时。代码中充斥着 ToOgre、ToThis、ToThat 转换函数。那是很多 Float3 复制,首先不应该发生。

在 C++ 或任何其他语言中,我们不必将一种类型转换(复制)到另一种类型,这本质上是相同的。但是 C++ 中的任何解决方案,因为大多数优秀的 gamedevs 库都是用于 c/c++ 的。

0 投票
5 回答
11544 浏览

dynamic - 使用 C# 4 对动态对象进行 Duck 类型测试

我想在 C# 中使用动态对象有一个简单的鸭子类型示例。在我看来,动态对象应该具有 HasValue/HasProperty/HasMethod 方法,其中包含一个字符串参数,用于在尝试对其运行之前查找您正在寻找的值、属性或方法的名称。我试图避免 try/catch 块,并尽可能地进行更深入的反思。在动态语言(JS、Ruby、Python 等)中进行鸭式输入似乎是一种常见做法,即在尝试使用属性/方法之前对其进行测试,然后返回默认值或抛出受控异常. 下面的例子基本上就是我想要完成的。

如果上述方法不存在,有没有人有预先制作的动态扩展方法可以做到这一点?


示例:在 JavaScript 中,我可以很容易地测试对象上的方法。


我将如何在 C# 中做同样的事情?

0 投票
2 回答
1335 浏览

c# - Duck Typing DynamicObject 派生

我写了一个类,它允许派生指定哪些属性可以延迟加载。代码是:

还有一个派生类:

这对于获取和设置属性值非常有效,但是当我隐式转换时我会得到一个 RuntimeBinderException 或者一个 InvalidCastException 并且将 SelfHydratingEntity 显式转换回 T。

我知道您可以覆盖 DynamicObject.TryConvert 方法,但我想知道这个方法中到底要放什么。我今天读了很多关于鸭子类型的文章,并尝试了几个库,但没有一个适用于这个特定的场景。我今天尝试的所有库都使用 Reflection.Emit 生成一个包装器类,该类调用“get_”和“set_”方法,并自然地使用反射在包装实例上查找这些方法。SelfHydratingEntity 当然没有定义“get_”和“set_”方法。

所以,我想知道这种事情是否可能。有没有办法将 SelfHydratingEntity 的实例转换为 T?我正在寻找这样的东西:

0 投票
2 回答
977 浏览

duck-typing - 没有鸭子类型的动态类型?

我习惯于动态类型,这意味着在运行时检查对象/非面向对象结构的类型信息并抛出某种类型错误,即如果它像鸭子一样嘎嘎叫,那就是鸭子。是否有不同类型的动态类型(请详细说明)。