首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将块作为参数传递和将proc作为参数传递有什么区别?

将块作为参数传递和将proc作为参数传递有什么区别?
EN

Stack Overflow用户
提问于 2020-12-11 09:11:27
回答 1查看 96关注 0票数 0

我们必须编写一个应该接受数组、proc和块作为args的函数。当传递到块中时,它应该返回数组中具有最大结果的元素。如果是平局,它应该使用proc来打破平局。

解决方案如下:

代码语言:javascript
运行
复制
def max_tie_breaker(array, tie_breaker, &prc)
    return nil if array.empty?
    max = array.first
    array.each do |el|
        result_el = prc.call(el)
        result_max = prc.call(max)
        if result_el > result_max
            max = el
        elsif result_el == result_max && tie_breaker.call(el) > tie_breaker.call(max)
            max = el
        end
    end
    max
end

在测试代码时,他们执行了以下操作:

代码语言:javascript
运行
复制
array_1 =['potato', 'swimming', 'cat'] 
array_2 = ['cat', 'bootcamp', 'swimming', 'ooooo']
array_3 = ['photo','bottle', 'bother'] 
length = Proc.new { |s| s.length } 
o_count = Proc.new { |s| s.count('o') }

        

print max_tie_breaker(array_1, o_count, &length)
#('swimming')
puts
print max_tie_breaker(array_2, length, &o_count)
#('ooooo')
puts

我不明白的是,如果他们传递一个块和一个proc作为参数,那么这个块将在方法参数中显示为&prc,当方法被调用时,将通过传递一个块来调用。例如,要调用max_tie_breaker,您不会输入: max_tie_breaker(array_1,o_count) { |s| s.length }而不是max_tie_breaker(array_1,o_count,&length)。基本上,我不理解他们怎么会有一个方法需要一个数组,一个块和一个proc作为参数,但是用一个数组和两个proc调用它,它仍然工作得很好。

提前感谢您的帮助或指导。

EN

回答 1

Stack Overflow用户

发布于 2020-12-11 19:55:17

&运算符尝试将后面的任何内容转换为块。

因此,当您使用foo(a, &b)调用一个方法时,该方法不会接收2个参数,该方法会接收a作为它的第一个也是唯一一个参数,并且还会给出一个块。

方法可以使用yield关键字调用块,也可以再次使用&操作符将它们转换为可调用的procs。

例如,可以将def foo(a, &b)称为foo(a, &b)foo(a) { "bar" }。在这两种情况下,方法b内部都将是一个代表给定块的proc。

使用两个proc而不是proc和一个块调用此方法会产生错误。

代码语言:javascript
运行
复制
def foo(a, &b)
end

foo(->{}, ->{}) # ArgumentError: wrong number of arguments (given 2, expected 1)
foo(->{}, &->{}) # nil
foo(->{}) {} # nil
foo(->{}) do end # nil
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65244458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档