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

时间:2011-05-08 15:46:40

标签: ruby oop duck-typing

这真让我感到困惑,似乎一次又一次地遇到ruby原生数据类型的方法,它们做同样的事情(本质上),但却有不同的名字。如果ruby和ruby社区强烈鼓励鸭子打字,为什么这些方法在各种类型中的命名一致?

1 个答案:

答案 0 :(得分:11)

您似乎暗示Hash没有length方法和/或其他枚举没有count方法。事实并非如此。

countEnumerable模块中定义的方法,因此可用于所有枚举。它与sizelength的区别在于以下几种方式:

  1. 它(可选)采用一个块来指定要计算的元素种类。
  2. 它适用于所有可用的枚举 - 不仅仅是跟踪它们大小的那些 - 但它在O(n)中有一个运行时用于那些没有(并且总是当给出一个块当然)的运行时。
  3. lengthsize(它们是同义词)是在所有可跟踪其大小的可枚举类上定义的方法(包括Hash)。它们与计数的不同之处在于它们总是在O(1)时间内返回长度并且不会阻塞。

    总结:您可以在跟踪其大小的任何对象上调用lengthsize,并且可以在任何可枚举的对象上调用count。所以鸭子打字不会受到任何阻碍。