如何创建Ienumerable计数方法?

时间:2014-01-05 00:03:17

标签: ruby enumerable

我正在尝试重新创建“Projects: Advanced Building Blocks”中的Enumerable count方法。

Ruby文档中的定义是count

  

“通过枚举返回枚举中的项目数。如果给出了参数,则枚举枚举中等于项目的项目数。如果给出了一个块,它将计算产生真实价值的元素数量。“

虽然默认参数究竟是什么?

到目前为止,我接近这个的方式如下: 没有参数传递时,参数设置为某事:

案例,当self不是字符串时:

  1. 当给出参数和给出块时(例如[1,2,3].count(3) { |x| x == 3 }): 返回警告和参数计数。

  2. 给出参数且没有阻塞(例如[1,2,3].count(3)): 返回参数的计数。

  3. 当没有参数和没有块时(例如[1,2,3].count): 返回实例的大小。

  4. else(没有给出参数和给出阻止)(例如[1,2,3].count { |x| x == 3 }: 根据块中给出的规格返回计数。

  5. 我的两个问题基本上是:

    • count的默认参数是什么?
    • 警告中使用的全局变量是什么?

    这是我的代码:

    module Enumerable
    
      def my_count arg='default value'
        if kind_of? String
          # code
        else # I think count works the same way for hashes and arrays
          if arg != 'default value' 
            count = 0
            for index in 0...size
              count += 1 if arg == self[index]
            end
            warn "#{'what goes here'}: warning: block not used" if block_given?
            count
          else
            return size if arg == 'default value' && !block_given?
            count = 0
            for index in 0...size
              count += 1 if yield self[index]
            end
            count
          end
        end
      end
    
    end
    

1 个答案:

答案 0 :(得分: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