我正在尝试重新创建“Projects: Advanced Building Blocks”中的Enumerable count
方法。
Ruby文档中的定义是count
“通过枚举返回枚举中的项目数。如果给出了参数,则枚举枚举中等于项目的项目数。如果给出了一个块,它将计算产生真实价值的元素数量。“
虽然默认参数究竟是什么?
到目前为止,我接近这个的方式如下: 没有参数传递时,参数设置为某事:
案例,当self不是字符串时:
当给出参数和给出块时(例如[1,2,3].count(3) { |x| x == 3 }
):
返回警告和参数计数。
给出参数且没有阻塞(例如[1,2,3].count(3)
):
返回参数的计数。
当没有参数和没有块时(例如[1,2,3].count
):
返回实例的大小。
else(没有给出参数和给出阻止)(例如[1,2,3].count { |x| x == 3 }
:
根据块中给出的规格返回计数。
我的两个问题基本上是:
这是我的代码:
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
答案 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