2014-01-05 2 views
1

Я пытаюсь воссоздать метод count Enumerable, как указано в «Projects: Advanced Building Blocks».Как восстановить метод подсчета Enumerable?

Определение в документации Ruby, является то, что count

«Возвращает количество элементов в перечислении через перечисление. Если аргумент задан, то число элементов в перечислении, которые равны п подсчитываются. Если задан блок, он подсчитывает количество элементов, дающих истинное значение ».

Что именно является аргументом по умолчанию?

Так я подошел к этому до сих пор выглядит следующим образом: параметр имеет значение, если аргумент не передается так:

случай, когда я не является строкой:

  1. когда аргумент заданный и заданный блок (например, [1,2,3].count(3) { |x| x == 3 }): возвращает предупреждение и счет аргумента.

  2. , когда аргумент задан и нет блока (например, [1,2,3].count(3)): возвращает кол-во аргументов.

  3. , когда нет аргументов и нет блока (например, [1,2,3].count): возвращает размер экземпляра.

  4. еще (аргумент не дал и блок задан) (например, [1,2,3].count { |x| x == 3 }:. возвращает количество на основе спецификаций, приведенных в блоке

два вопроса, у меня есть, в основном:.

  • Что такое аргумент по умолчанию для подсчета?
  • Какая глобальная переменная используется при предупреждении?

Вот мой код:

+0

Начиная с Ruby 1.9, Enumerable не смешивается классом String, поэтому вы можете предположить, что приемник не является строкой. Не существует аргумента по умолчанию. Существует переменное количество аргументов: ноль или один. Вы хотите 'def my_count (* args)', а затем проверить 'args.size', который может быть равен нулю, один или несколько. (Если более одного, вы можете создать исключение 'ArgumentError'). –

ответ

3

Не используйте аргумент по умолчанию. Используйте *args, чтобы собрать все аргументы в массив.

def my_count(*args, &block) 

    if args.length == 1 && !block_given? 
    # use args[0] 
    elsif args.length == 1 && block_given? 
    # use block 
    elsif args.length == 0 && !block_given? 
    # no argument/block 
    else 
    # raise error 
    end 
end 
+0

спасибо, что это работает! – user3015876