问题标签 [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 回答
99 浏览

naming-conventions - 如何称为使用鸭子打字

我应该如何调用使用鸭子打字的过程?我应该说“我正在执行鸭子打字”或“我正在检查它是否是鸭子:)”。

鸭子检查听起来不太好,类型检查只是简单的错误名称。

0 投票
1 回答
1841 浏览

webforms - 无效的对象名称“aspnet_Membership”

我使用 Visual Studio 和 c# win forms(网络表单)。我尝试打开与 MS 2005 服务器和阅读器查询的连接。这里 - 是

这些表存在于数据库中。无效的对象名称“aspnet_Membership”。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:对象名称“aspnet_Membership”无效。

源错误:

我烦了。提前致谢

0 投票
3 回答
1613 浏览

php - 所有动态语言都支持鸭子类型吗?

所有动态语言都支持鸭式打字吗?

我认为 PHP 支持鸭子类型。是这样吗?

0 投票
6 回答
773 浏览

java - 为什么必须在 Java 中声明接口?

有时我们有几个类,它们的某些方法具有相同的签名,但不对应于已声明的 Java 接口。例如,JTextFieldJButton(以及 中的其他几个 javax.swing.*)都有一个方法

现在,假设我希望对具有该方法的对象做一些事情;然后,我想要一个接口(或者自己定义它),例如

这样我就可以写:

但是,可悲的是,我不能:

这种演员阵容是非法的。编译器知道JButton 不是a CanAddActionListener,因为该类尚未声明实现该接口......但是它“实际上”实现了它

这有时会带来不便——Java 本身已经修改了几个核心类来实现由旧方法(String implements CharSequence例如 )组成的新接口。

我的问题是:为什么会这样?我理解声明一个类实现一个接口的实用性。但是无论如何,看看我的例子,为什么编译器不能推断出类JButton“满足”接口声明(查看它的内部)并接受强制转换?是编译器效率的问题还是有更根本的问题?

我对答案的总结:在这种情况下,Java 可以允许一些“结构类型”(有点像鸭子类型 - 但在编译时检查)。它没有。除了一些(对我来说不清楚)性能和实现方面的困难之外,这里还有一个更基本的概念:在 Java 中,接口(通常是所有东西)的声明不仅仅是结构性的(具有这些签名)但语义:这些方法应该实现一些特定的行为/意图。因此,在结构上满足某些接口的类(即,它具有具有所需签名的方法)不一定在语义上满足它(一个极端的例子:回想一下“标记接口”,它甚至没有方法!)。因此,Java 可以断言一个类实现了一个接口,因为(并且仅仅是因为)它已被显式声明。其他语言(Go、Scala)有其他的哲学。

0 投票
1 回答
251 浏览

ruby - 如果 ruby​​ 如此鼓励鸭子打字,为什么我们不用 Hash.count 而不是 Hash.length?

这真的让我感到困惑,似乎我一次又一次地遇到了 ruby​​ 本机数据类型中的方法,这些方法(本质上)做同样的事情,但有不同的名称。如果 ruby​​ 和 ruby​​ 社区如此强烈地鼓励鸭子类型,那么为什么这些方法在类型之间没有一致的命名呢?

0 投票
2 回答
198 浏览

grails - Grails:鸭子类型和多对多集合类

在我的 Grails 应用程序中,一个人对某事有一种喜爱——而某事可能是一个想法、一个决定、一个小组或另一个人。

在 Java 中,我会强加一个 Something 接口,以便这些类中的每一个都可以作为 Something 类型传入。

在 Groovy/Grails 中,我让它在Something 是一个Groovy 类和Fondness 类是一个将Persons 映射到Somethings 的集合类的地方工作。

在这种情况下,当我尝试利用 Duck Typing 时,我绊倒了。如何设置一个集合类,将 Person 映射到我的任何一组类,而不强加接口?

感谢您的任何建议!我很高兴听到 G/G 开发人员将如何处理这个问题。

-账单

0 投票
3 回答
275 浏览

ruby - 这看起来像 Ruby 的鸭子打字吗?

我创建了一个程序来跟踪汽车里程和服务历史,以便更新用户对汽车的未来服务需求。

我有三个类:CarCarHistoryCarServiceHistoryEntry。第三个是直截了当的;它包含与服务相关的所有属性:日期、里程、执行的服务等。CarHistory类如下:

  1. initialize中,是否应该entry检查类?
  2. add_service_entry,采用鸭子类型(如安迪托马斯在“编程Ruby”中的论点),我什至会测试是否CarServiceHistoryEntry可以添加a?我不能只通过 aString而不是设置然后添加CarServiceHistoryEntry我的单元测试吗?
  3. 由于 a 的唯一必要属性CarHistoryentries数组和to_s方法,我是否应该将这个类全部废弃并将其放入car类中?
0 投票
5 回答
3618 浏览

ruby - Ruby 参数类型确认

来自 Java 背景的我对 Ruby 对其方法参数完全无视的态度感到有些不安。在 Java 中,我可以保证参数 x 是方法正常工作所必需的类型,而在 Ruby 中,我无法保证 x 是整数、字符串或其他任何东西。

示例:如果我想在 Java 中编写一个 absolute_value 方法,标题将类似于

在 Ruby 中,它会类似于

在这个例子中,在 Java 代码中,我可以完全确定传入的参数不是“生日快乐!” 但在Ruby代码中我不知道。如何在 Ruby 中防止这种情况,使代码不会在运行时崩溃?

0 投票
3 回答
6359 浏览

c# - 在 C# 编译器中输入鸭子

注意不是关于如何在 C# 中实现或模拟鸭子类型的问题...

几年来,我的印象是某些 C# 语言特性依赖于语言本身定义的数据结构(在我看来,这总是一个奇怪的鸡和蛋的场景)。例如,我的印象是foreach循环仅可用于已实现的类型IEnumerable

从那时起,我开始明白 C# 编译器使用鸭子类型来确定对象是否可以在 foreach 循环中使用,寻找GetEnumerator方法而不是IEnumerable. 这很有意义,因为它消除了鸡和蛋的难题。

我有点困惑,为什么using块和IDisposable. 编译器是否有任何特殊原因不能使用鸭子类型并寻找Dispose方法?这种不一致的原因是什么?

也许 IDisposable 的幕后还有其他事情发生?

讨论为什么你会有一个没有实现 IDisposable 的 Dispose 方法的对象超出了这个问题的范围:)

0 投票
2 回答
250 浏览

objective-c - 如何在运行时确保协议一致性?

以上允许利用 KVC 并编写如下内容:

[[Dog new] valueForKey:@"quacks"]; // YES

但是,objc 运行时是否可以用于利用相同的 KVC 机制,并且在运行时符合 Duck 协议?