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

Jer*_*ith -1 ruby oop duck-typing

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

sep*_*p2k 11

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

countEnumerable模块中定义的方法,因此可用于所有可用的枚举.它不同于sizelength在以下几个方面:

  1. 它(可选)采用一个块来指定要计算哪种元素.
  2. 它可用于所有可用的枚举 - 不仅仅是那些跟踪它们的大小 - 但它有一个运行时O(n)用于那些没有(并且总是当给出一个块当然).

lengthsize(它们是同义词)是在所有可枚举类上定义的方法,用于跟踪它们的大小(包括Hash).它们与计数的不同之处在于它们总是及时返回长度O(1)并且不会阻塞.

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