Ruby方法可以接受块或参数吗?
我正在Odin项目中上课,现在我必须自己编写一个新的#count方法(带有另一个名字),其行为类似于Enumerable模块中的正常方法.
关于计数的文档说明如下(http://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-count):
我想我可以将所有这些作为单独的方法编写,但我主要想知道一个方法定义是否可以结合count的最后两次使用 – 使用item和block.当然,我想知道这三个是否可以合并在一个定义中,但我最感兴趣的是最后两个.到目前为止,我似乎找不到可能的答案. 文档页面包含以下示例: ary = [1,2,4,2] ary.count #=> 4 ary.count(2) #=> 2 ary.count{ |x| x%2==0 } #=> 3 解决方法
当然有可能.您所要做的就是检查是否给出了参数,并检查是否给出了一个块.
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 要么: def call_me(arg=nil,&block) puts "arg given" unless arg.nil? puts "block given" unless block.nil? end 后者很有用,因为它将块转换为可以重复使用的Proc(命名块),如下所示. 您可以像这样实现自己的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 reduce(0) {|cnt,i| counter.call(i) ? cnt + 1 : cnt } end end p [1,3,5].my_count # => 5 p [1,5].my_count(2) # => 1 p [1,5].my_count {|i| i % 2 == 0 } # => 2 在repl.it上看到它:https://repl.it/FcNs (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |