问题标签 [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 投票
10 回答
12686 浏览

groovy - 鸭子类型与静态类型有哪些优势?

我正在对 Groovy 进行更多的研究和试验,并且试图围绕在 Groovy 中实现我在 Java 中不能/不做的事情的利弊展开思考。动态编程对我来说仍然只是一个概念,因为我已经深深地沉浸在静态和强类型语言中。

Groovy 给了我鸭式的能力,但我看不出它的价值。鸭式打字比静态打字更有效率吗?我在代码实践中可以做哪些事情来帮助我掌握它的好处?

我问这个问题时考虑到了 Groovy,但我知道这不一定是 Groovy 问题,所以我欢迎每个代码营的回答。

0 投票
17 回答
3944 浏览

php - 动态语言中的接口有什么意义吗?

在像 Java 这样的静态语言中,您需要接口,因为否则类型系统不会让您做某些事情。但在 PHP 和 Python 等动态语言中,您只需利用鸭子类型

PHP 支持接口。Ruby 和 Python 没有它们。因此,没有它们,您显然可以幸福地生活。

我大部分时间都在使用 PHP 进行工作,但从未真正使用过定义接口的能力。当我需要一组类来实现某个通用接口时,我只是在文档中描述它。

所以你怎么看?完全不使用动态语言的接口不是更好吗?

0 投票
9 回答
2913 浏览

python - 'from X import a' 与 'import X; Xa'

我见过一些 Python 程序员相当一致地使用以下风格(我们称之为风格 1):

为了支持这种风格,您可以引用“显式优于隐式”的格言。我见过其他程序员使用这种风格(风格 2):

我在样式 2 中看到的主要好处是可维护性——尤其是对于鸭子类型的理想,我可能想将 some_module 换成 some_other_module。我也觉得风格 2 以“可读性很重要”的格言赢得了积分。尽管我倾向于不同意,但人们总是可以争辩说,在使用第一种样式时,搜索和替换同样是一个不错的选择。

附录:有人指出,您可以使用样式 1as来解决从some_moduleto的切换some_other_module。我忘了提到,决定some_identifier当前模块中实现也很常见,这使得创建等效some_module容器有点尴尬。

0 投票
3 回答
791 浏览

ruby-on-rails - 我可以用鸭子打字改进这种方法吗?

希望我没有误解“鸭子类型”的含义,但从我所读到的,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。

这是代码:

我想要的是确保我最终得到一个散列,其中键是一个整数,表示 ActiveRecord 对象的 ID。我不是特别喜欢必须遍历哈希键两次all?以确定是否需要取出 ID。

当然,我也会接受任何其他改进此代码的建议 :)

0 投票
3 回答
759 浏览

dynamic - C#4.0 动态对象是否有一些鸭子类型的功能?

根据 Anders 的说法,在 C#4.0 中,我们将获得动态类型,或“静态类型为动态”的对象。这将允许在运行时而不是编译时发生任何方法调用解析。但是是否有工具将动态对象绑定到某种合约(从而也获得完整的智能感知),而不是允许对其进行任何调用,即使你知道这不太可能是有效的。

即,而不仅仅是

有能力对其进行转换或转换以将其限制为已知的合同,例如

甚至只是

在 C#4.0 的现有材料中找不到类似的东西,但它似乎是动态范式的逻辑扩展。有更多信息的人吗?

0 投票
15 回答
4366 浏览

class - 有没有静态鸭子类型的语言?

声明成员时可以指定接口吗?

在考虑了这个问题一段时间后,我突然想到静态鸭子类型的语言可能真的有效。为什么预定义的类不能在编译时绑定到接口?例子:

你知道任何支持这种功能的语言吗?它对 Java 或 C# 有帮助吗?它在某些方面存在根本性缺陷吗?我知道你可以继承 MyClass 并实现接口或使用 Adapter 设计模式来完成同样的事情,但这些方法看起来像是不必要的样板代码。

0 投票
10 回答
4307 浏览

interface - 鸭子类型与旧的“变体”类型和/或接口有何不同?

我经常看到“鸭子打字”这个短语在流传,甚至遇到一两个代码示例。我太懒了,没时间做自己的研究,有人可以简单地告诉我:

  • 'duck type' 和 old-skool 'variant type' 之间的区别,以及
  • 提供一个我可能更喜欢鸭子打字而不是变体打字的例子,以及
  • 提供一个我必须使用鸭子打字来完成的事情的例子?

鸭子打字插图由 The Register 提供

我并不是想通过怀疑这种“新”结构的力量来显得家常便饭,我也不是通过拒绝进行研究来回避这个问题,但我对我所看到的所有蜂拥而至的炒作感到震惊最近呢。对我来说,它看起来像没有打字(又名动态打字),所以我没有立即看到优势。

附录:感谢到目前为止的示例。在我看来,使用“O->can(Blah)”之类的东西相当于进行反射查找(这可能并不便宜),和/或与编译器可能会说的(O 是 IBlah)大致相同能够为您检查,但后者的优点是可以将我的 IBlah 接口与您的 IBlah 接口区分开来,而其他两个则没有。当然,每个方法都有很多微小的接口会变得混乱,但同样可以检查很多单独的方法......

...所以我还是不明白。这是一个很棒的节省时间的方法,还是一个全新的麻袋里的旧东西?需要鸭子打字的例子在哪里?

0 投票
3 回答
781 浏览

refactoring - Duck 类型作为反射的语法糖:好主意还是坏主意?

我最近一直在想,在 Java 和 C# 等语言中,将“鸭子”类型作为方法参数类型包含在内是否是一种很好的语法糖形式?这将如下所示:

这可能是通过反射调用 doStuff() 的语法糖,或者它可以以不同的方式实现。Foo 可以是任何类型。如果 foo 没有 doStuff() 方法,这将引发运行时异常。关键是,当您需要时,即大多数时候,您将获得更严格的预先指定的接口范例(性能、错误检查)的好处。同时,您将拥有一个简单、干净的后门来避免打字,这将允许您干净地进行初始设计中未预见到的更改,而无需进行大量重构。此外,它可能会 100% 向后兼容,并与现有的语言结构完美结合。我认为这可能有助于减少过度设计的以防万一的编程风格,这种风格会导致混乱、混乱的 API。

0 投票
13 回答
1447 浏览

python - 动态语言的用途

我现在的主要语言是 D,我正在学习 Python,因为它是我正在学习的课程所必需的。虽然我理解为什么动态语言对于在没有类型推断或模板的情况下使用静态语言进行编程的人们来说是一股新鲜空气(恕我直言,模板在很大程度上是编译时的鸭子类型),但我很好奇动态语言有什么好处即使你有这些。

底线是,如果我要学习 Python,我想以一种真正改变我对编程的想法的方式来学习它,而不是仅仅用 Python 编写 D。我没有使用过动态语言,因为我是一个相当新手的程序员,无法欣赏它们应该提供的灵活性,并且现在想学习充分利用它们。什么可以在动态类型的解释语言中轻松/优雅地完成,而这在静态语言中是尴尬或不可能的,即使使用模板、多态性、静态类型推断,也许还有运行时反射?

0 投票
4 回答
1396 浏览

ruby-on-rails - 当您说 Ruby 具有反射性时,这主要是指“鸭子打字”吗?

我正在阅读描述 Ruby 的文本,它说以下内容:

Ruby 被认为是一种“反射性”语言,因为 Ruby 程序可以分析自身(根据其构成),调整其工作方式,甚至用其他代码覆盖自己的代码。

我对“反射”这个术语感到困惑 - 这主要是在谈论 Ruby 可以查看变量并确定它是整数还是字符串(鸭子类型)的方式,例如: