gpt4 book ai didi

ruby - Ruby 方法可以接受 block 或参数吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:05:00 26 4
gpt4 key购买 nike

我正在上 The Odin Project 的类(class),现在我必须自己编写一个新的 #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

最佳答案

当然可以。您所要做的就是检查是否给出了参数,并检查是否给出了 block 。

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

后者很有用,因为它将 block 转换为 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)

在 repl.it 上查看:https://repl.it/@jrunning/YellowishPricklyPenguin-1

关于ruby - Ruby 方法可以接受 block 或参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42119658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com