加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby方法可以接受块或参数吗?

发布时间:2020-12-17 02:49:43 所属栏目:百科 来源:网络整理
导读:我正在Odin项目中上课,现在我必须自己编写一个新的#count方法(带有另一个名字),其行为类似于Enumerable模块中的正常方法. 关于计数的文档说明如下(http://ruby-doc.org/core-2.4.0/Enumerable.html#method-i-count): count → int count(item) → int count
我正在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

Returns the number of items in enum through enumeration. If an
argument is given,the number of items in enum that are equal to item
are counted. If a block is given,it counts the number of elements
yielding a true value.

我想我可以将所有这些作为单独的方法编写,但我主要想知道一个方法定义是否可以结合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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读