Один шаг к овладению Ruby - научиться расширять базовые классы, когда вам нужна некоторая функциональность, достаточно общая, чтобы иметь смысл в качестве «основной» операции.Если ваш опыт программирования на менее динамичных языках, это займет некоторое время.В этом случае я бы добавил что-то вроде этого:
require 'set'
module Enumerable
def uniq(&b)
if block_given?
self.map(&b).to_set.to_a
else
self.to_set.to_a
end
end
end
Это будет не так эффективно, как uniq
, встроенный в Ruby 1.9, но все равно O (n).
Добавление этого в Enumerable означает, что вы можете использовать его для других вещей, кроме массивов.Если определенный перечислимый класс определяет более эффективную версию, это не будет переопределять ее - алгоритм поиска метода Ruby сначала проверяет методы, определенные непосредственно в классе, прежде чем искать методы, определенные во включенных модулях.
Если вычасто используйте Ruby 1.8, вы можете добавить это в файл ваших собственных расширений ядра и использовать его в будущих проектах.Если вам интересно, вы можете увидеть некоторые из моих личных расширений ядра на https://github.com/alexdowad/showcase/blob/master/ruby-core/collections.rb (это для Ruby 1.9).