问题标签 [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.
naming-conventions - 如何称为使用鸭子打字
我应该如何调用使用鸭子打字的过程?我应该说“我正在执行鸭子打字”或“我正在检查它是否是鸭子:)”。
鸭子检查听起来不太好,类型检查只是简单的错误名称。
webforms - 无效的对象名称“aspnet_Membership”
我使用 Visual Studio 和 c# win forms(网络表单)。我尝试打开与 MS 2005 服务器和阅读器查询的连接。这里 - 是
这些表存在于数据库中。无效的对象名称“aspnet_Membership”。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.Data.SqlClient.SqlException:对象名称“aspnet_Membership”无效。
源错误:
我烦了。提前致谢
php - 所有动态语言都支持鸭子类型吗?
所有动态语言都支持鸭式打字吗?
我认为 PHP 支持鸭子类型。是这样吗?
java - 为什么必须在 Java 中声明接口?
有时我们有几个类,它们的某些方法具有相同的签名,但不对应于已声明的 Java 接口。例如,JTextField
和JButton
(以及 中的其他几个 javax.swing.*
)都有一个方法
现在,假设我希望对具有该方法的对象做一些事情;然后,我想要一个接口(或者自己定义它),例如
这样我就可以写:
但是,可悲的是,我不能:
这种演员阵容是非法的。编译器知道这JButton
不是a CanAddActionListener
,因为该类尚未声明实现该接口......但是它“实际上”实现了它。
这有时会带来不便——Java 本身已经修改了几个核心类来实现由旧方法(String implements CharSequence
例如 )组成的新接口。
我的问题是:为什么会这样?我理解声明一个类实现一个接口的实用性。但是无论如何,看看我的例子,为什么编译器不能推断出类JButton
“满足”接口声明(查看它的内部)并接受强制转换?是编译器效率的问题还是有更根本的问题?
我对答案的总结:在这种情况下,Java 可以允许一些“结构类型”(有点像鸭子类型 - 但在编译时检查)。它没有。除了一些(对我来说不清楚)性能和实现方面的困难之外,这里还有一个更基本的概念:在 Java 中,接口(通常是所有东西)的声明不仅仅是结构性的(具有这些签名)但语义:这些方法应该实现一些特定的行为/意图。因此,在结构上满足某些接口的类(即,它具有具有所需签名的方法)不一定在语义上满足它(一个极端的例子:回想一下“标记接口”,它甚至没有方法!)。因此,Java 可以断言一个类实现了一个接口,因为(并且仅仅是因为)它已被显式声明。其他语言(Go、Scala)有其他的哲学。
ruby - 如果 ruby 如此鼓励鸭子打字,为什么我们不用 Hash.count 而不是 Hash.length?
这真的让我感到困惑,似乎我一次又一次地遇到了 ruby 本机数据类型中的方法,这些方法(本质上)做同样的事情,但有不同的名称。如果 ruby 和 ruby 社区如此强烈地鼓励鸭子类型,那么为什么这些方法在类型之间没有一致的命名呢?
grails - Grails:鸭子类型和多对多集合类
在我的 Grails 应用程序中,一个人对某事有一种喜爱——而某事可能是一个想法、一个决定、一个小组或另一个人。
在 Java 中,我会强加一个 Something 接口,以便这些类中的每一个都可以作为 Something 类型传入。
在 Groovy/Grails 中,我让它在Something 是一个Groovy 类和Fondness 类是一个将Persons 映射到Somethings 的集合类的地方工作。
在这种情况下,当我尝试利用 Duck Typing 时,我绊倒了。如何设置一个集合类,将 Person 映射到我的任何一组类,而不强加接口?
感谢您的任何建议!我很高兴听到 G/G 开发人员将如何处理这个问题。
-账单
ruby - 这看起来像 Ruby 的鸭子打字吗?
我创建了一个程序来跟踪汽车里程和服务历史,以便更新用户对汽车的未来服务需求。
我有三个类:Car
、CarHistory
和CarServiceHistoryEntry
。第三个是直截了当的;它包含与服务相关的所有属性:日期、里程、执行的服务等。CarHistory
类如下:
- 在
initialize
中,是否应该entry
检查类? - 在
add_service_entry
,采用鸭子类型(如安迪托马斯在“编程Ruby”中的论点),我什至会测试是否CarServiceHistoryEntry
可以添加a?我不能只通过 aString
而不是设置然后添加CarServiceHistoryEntry
我的单元测试吗? - 由于 a 的唯一必要属性
CarHistory
是entries
数组和to_s
方法,我是否应该将这个类全部废弃并将其放入car
类中?
ruby - Ruby 参数类型确认
来自 Java 背景的我对 Ruby 对其方法参数完全无视的态度感到有些不安。在 Java 中,我可以保证参数 x 是方法正常工作所必需的类型,而在 Ruby 中,我无法保证 x 是整数、字符串或其他任何东西。
示例:如果我想在 Java 中编写一个 absolute_value 方法,标题将类似于
在 Ruby 中,它会类似于
在这个例子中,在 Java 代码中,我可以完全确定传入的参数不是“生日快乐!” 但在Ruby代码中我不知道。如何在 Ruby 中防止这种情况,使代码不会在运行时崩溃?
c# - 在 C# 编译器中输入鸭子
注意这不是关于如何在 C# 中实现或模拟鸭子类型的问题...
几年来,我的印象是某些 C# 语言特性依赖于语言本身定义的数据结构(在我看来,这总是一个奇怪的鸡和蛋的场景)。例如,我的印象是foreach
循环仅可用于已实现的类型IEnumerable
。
从那时起,我开始明白 C# 编译器使用鸭子类型来确定对象是否可以在 foreach 循环中使用,寻找GetEnumerator
方法而不是IEnumerable
. 这很有意义,因为它消除了鸡和蛋的难题。
我有点困惑,为什么using
块和IDisposable
. 编译器是否有任何特殊原因不能使用鸭子类型并寻找Dispose
方法?这种不一致的原因是什么?
也许 IDisposable 的幕后还有其他事情发生?
讨论为什么你会有一个没有实现 IDisposable 的 Dispose 方法的对象超出了这个问题的范围:)
objective-c - 如何在运行时确保协议一致性?
以上允许利用 KVC 并编写如下内容:
[[Dog new] valueForKey:@"quacks"]; // YES
但是,objc 运行时是否可以用于利用相同的 KVC 机制,并且在运行时符合 Duck 协议?