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

java - Java:如何声明一个变量实现了一个接口?

在 Objective-C 中,我可以这样做:

delegate(类型的变量id)符合HTTPRequestDelegate协议(或HTTPRequestDelegate用Java语言实现接口)。

这样,每当我将HTTPRequestDelegate协议定义的消息发送到delegate时,编译器都会理解该delegate响应。

我如何在 Java 中做到这一点,即鸭子类型/动态类型?

0 投票
5 回答
7033 浏览

python - 如何在 Python 中处理“鸭子打字”?

我通常希望我的代码尽可能通用。我目前正在编写一个简单的库,这次能够在我的库中使用不同的类型感觉特别重要。

一种方法是强迫人们继承一个“接口”类。对我来说,这感觉更像是 Java 而不是 Python,并且issubclass在每种方法中使用听起来也不是很诱人。

我的首选方式是善意使用该对象,但这会引发一些AttributeErrors. 我可以将每个危险的调用包装在一个 try/except 块中。这也似乎有点麻烦:

我是否应该跳过错误处理并期望人们只使用具有所需方法的对象?如果我做了一些愚蠢的事情,比如[x**2 for x in 1234]我实际上得到的是 aTypeError而不是 a AttributeError(整数不可迭代),那么某处必须进行一些类型检查——如果我想做同样的事情怎么办?

这个问题有点开放式,但是以干净的方式处理上述问题的最佳方法是什么?是否有任何既定的最佳实践?例如,上面的可迭代“类型检查”是如何实现的?

编辑

虽然AttributeErrors 很好,但TypeErrors本机函数引发的通常会提供有关如何解决错误的更多信息。以此为例:

我希望我的图书馆尽可能有用。

0 投票
4 回答
581 浏览

ruby - 如何在避免类型检查的同时检测类似数组或集合的值

我有一个接受参数的方法,该参数可以是类似数组/集合的对象或哈希。该方法的要点如下:

该方法将接受一组 ID 对象并将其转换为 MongoDB 的哈希条件。

上面代码有两个问题:

  1. 如果标准库不需要“设置”,它将失败。我不想仅仅为了执行检查而要求依赖。
  2. 我不想进行严格的类型比较。我想接受任何类似数组或类似集合的值,并将其转换为带有to_a.

您将如何执行此检查?需要记住的一些注意事项:

  1. 我可以检查to_ary方法,但 Set 不响应to_ary. 实现此方法的对象本质上应该是数组,我同意 Set 本质上不是数组。请参阅在 Ruby 中实现 to_int 和 to_str 的后果
  2. 我无法检查,to_a因为哈希响应它
  3. Array 和 Set 通用但 Hash 不通用的方法是:

    /li>

我决定用这样的东西:

因为交集很可能是一个类似集合的对象的运算符。但我不确定这一点。

0 投票
2 回答
1716 浏览

ruby - Rails——单表继承——有缺陷的铸造方法?

所以我最近一直在研究单表继承,并找到了这个常见的问题/答案:

obj问题:在 STI 中,假设 Beta < Alpha,如何将对象的类别从 Alpha 更改为 Beta?

答:ruby 是一种鸭式语言,所以你不用强制转换。但是您需要做的就是将“type”变量设置为“Beta”并保存对象,下次加载 Alpha 对象时,它将是 Beta 类型:

但是,这种方法似乎对我不起作用。虽然 obj 确实可以正确保存,但它似乎根本不能用作 Beta 对象。它在不运行 Beta 验证的情况下保存,当我检查时obj.respond_to?(:beta_method) #beta_method being a method in the beta class,它返回 false。这种方法不起作用吗?有正确的方法吗?还是我只是做错了什么?

编辑

我发现当我执行 Alpha.last.respond_to(:beta_method) 时它返回 false,而 Beta.last.respond_to(:beta_method) 返回 true(但是 Alpha.last 和 Beta.last 返回相同的对象)。有趣的发展?不过,如果有人能详细解释这一点(关于 ruby​​ 如何处理继承),那就太棒了。

0 投票
2 回答
704 浏览

java - 如何将此鸭子类型(Python)转换为 Java 泛型?

以下面的简单 Python 函数为例:

它在行动中:

这个函数当然有缺陷——一方面,它不验证参数,而且它应该更聪明地设置返回值的类型——但它的优点是无论数据中的元素是整数或浮点数或其他一些数字类型。此外,默认情况下,它返回一个整数列表,但是,通过传递一个合适的函数作为可选的量化器参数,这种类型可以更改为其他类型。此外,如果 data 参数是一个列表,则返回值将是一个列表;如果 data 是一个元组,则返回值将是一个元组。(最后一个特性肯定是最弱的,但它也是我对在 Java 中复制最不感兴趣的特性,所以我没有费心让它变得更健壮。)

我想为这个函数编写一个有效的Java 等效函数,这意味着要弄清楚如何绕过 Java 的打字。自从我学习 Java(很久以前)以来,泛型就被引入了该语言。我尝试过学习 Java 泛型,但发现它们非常难以理解。我不知道这是由于早发性衰老,还是因为自从我上次在 Java 中编程(约 2001 年)以来,Java 的复杂性急剧增加,但我发现的关于这个主题的每一页都比上一页更令人困惑一。如果有人能告诉我如何用 Java 做到这一点,我将不胜感激。

谢谢!

0 投票
7 回答
11222 浏览

c++ - C++模板和鸭子类型有什么关系?

对我来说,C++ 模板使用了鸭子类型的思想,对吗?这是否意味着模板类或方法中引用的所有泛型类型都是鸭子类型?

0 投票
3 回答
1908 浏览

.net - F# 和鸭式打字

假设我在 F# 中定义了以下两种类型:

我期待以下方法适用于猫和狗:

实际上,似乎发生的事情是isOld只接受猫:

我希望 F# 足够聪明,可以X为猫和狗定义某种“虚拟”接口,以便isOld接受 X 作为参数,而不是Cat.

这不是 F# 在任何情况下都可以处理的事情,对吗?似乎 F# 类型推断系统不会做比 C# 对var类型变量所做的更多的事情。

0 投票
5 回答
155 浏览

python - 在这种情况下,我该如何平衡“Pythonic”和“convenient”?

我有一个将由客户端代码实现的“接口”:

run通常应该返回 adocutils node但因为最常见的情况是纯文本,调用者允许run返回一个字符串,该字符串将使用检查type()并转换为 a node

然而,按照我理解“Pythonic”的方式,这不是“Pythonic”,因为检查type()某物的“行为”不会让它“成为”一种类型——即“Pythonic”代码应该使用鸭子类型。

我考虑过

但我不在乎这个,因为它把不那么有趣的返回类型放在名称中;这让人分心。

有什么我错过的想法吗?此外,我的“坏”系统是否会在路上遇到问题(对我来说似乎或多或少是安全的)?

0 投票
1 回答
61 浏览

c# - 成员验证与接口

通过检查是否存在满足接口的方法/属性,我已经准备好使用 Ruby 强制执行带有动态类型的接口的方法。

总体而言,这在哪些方面比使用接口更好的设计原则?有什么优点/缺点。例如,您可以在 C# 中实现相同的概念,但我不确定它是否具有相同的值,

当然,您可以扩展它来检查不仅仅是名称,如签名、返回类型等。

想法?

0 投票
6 回答
1662 浏览

c++ - 带有接口的 C++ 编译时 Duck 类型

有没有办法在 C++ 中执行以下操作

在我看来,显式接口使函数期望的内容更加清晰。但是,我不想创建一个实际的接口类(非常繁琐)。