Если ruby ​​так сильно рекомендует печатать на утке, почему бы нам не использовать Hash.count вместо Hash.length? - PullRequest
0 голосов
/ 08 мая 2011

Это то, что меня действительно смущает, похоже, снова и снова я сталкиваюсь с методами в типах ruby-native, которые делают одно и то же (по сути), но при этом имеют разные имена. Если ruby ​​и ruby ​​community так сильно поощряют типизацию утиных утилит, почему эти методы не называются одинаково для разных типов?

1 Ответ

11 голосов
/ 08 мая 2011

Похоже, вы подразумеваете, что в Hash нет метода length и / или в других перечислимых элементах нет метода count. Это не правда.

count - это метод, определенный в модуле Enumerable и доступный для всех перечислимых элементов. Он отличается от size и length следующими способами:

  1. Он (необязательно) принимает блок, указывающий, какой тип элементов считать.
  2. Он доступен на всех перечислимых объектах - не только на тех, которые отслеживают их размер - однако он имеет время выполнения в O(n) для тех, которые этого не делают (и всегда, когда дан блок, конечно).

length и size (которые являются синонимами) - это методы, определенные для всех перечислимых классов, которые отслеживают их размер (включая Hash). Они отличаются от количества тем, что всегда возвращают длину в O(1) времени и не берут блок.

В итоге: вы можете вызвать length или size для любого объекта, который отслеживает его размер, и вы можете вызвать count для любого перечисляемого. Так что печатание утки никак не мешает.

...