Nik*_*y D 6 ruby count enumerable method-declaration
我正在做Odin项目的课程,现在我必须自己编写一个新#count方法(使用其他名称),其行为类似于Enumerable模块中的常规方法.
有关计数的文档说明如下(http://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-count):
count→int
count(item)→int
count {| obj | block}→int返回
enum通过枚举的项数.如果给出参数,则计算其中的项数enum等于item.如果给出了一个块,它会计算产生真值的元素数量.
我想我可以将所有这些作为单独的方法编写,但我主要想知道一个方法定义是否可以结合count- 使用item和使用块的最后两个用法.当然,我想知道这三个是否可以合并在一个定义中,但我最感兴趣的是最后两个.到目前为止,我似乎找不到可能的答案.
文档页面包含以下示例:
ary = [1, 2, 4, 2]
ary.count #=> 4
ary.count(2) #=> 2
ary.count{ |x| x%2==0 } #=> 3
Run Code Online (Sandbox Code Playgroud)
当然有可能.您所要做的就是检查是否给出了参数,并检查是否给出了一个块.
def call_me(arg=nil)
puts "arg given" unless arg.nil?
puts "block given" if block_given?
end
call_me(1)
# => arg given
call_me { "foo" }
# => block given
call_me(1) { "foo" }
# => arg given
# block given
Run Code Online (Sandbox Code Playgroud)
要么:
def call_me(arg=nil, &block)
puts "arg given" unless arg.nil?
puts "block given" unless block.nil?
end
Run Code Online (Sandbox Code Playgroud)
后者很有用,因为它将块转换为Proc(命名block),然后可以重用,如下所示.
您可以count像这样实现自己的方法:
module Enumerable
def my_count(*args, &block)
return size if args.empty? && block.nil?
raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 1)" if args.size > 1
counter = block.nil? ? ->(i) { i == args[0] } : block
sum {|i| counter.call(i) ? 1 : 0 }
end
end
arr = [1,2,3,4,5]
p arr.my_count # => 5
p arr.my_count(2) # => 1
p arr.my_count(&:even?) # => 2
p arr.my_count(2, 3) # => ArgumentError: wrong number of arguments (given 2, expected 1)
Run Code Online (Sandbox Code Playgroud)
看到它在repl.it:https://repl.it/FcNs