【问题标题】:Ruby - How to write a method that accepts a proc with varying numbers of params?Ruby - 如何编写一个接受具有不同数量参数的过程的方法?
【发布时间】:2020-05-10 21:50:47
【问题描述】:

我正在用 Ruby 编写一个Array#map! 方法,它应该接受一个过程:

def map!(&blck)

    (0..self.length-1).each do |i|
        self[i] = blck.call(i)
    end

    self
end

如果 proc 接受 1 个参数,这可以正常工作,但如果有多个参数(或者如果它接受字符而不是索引)则不行。两个过程示例:

prc1 = Proc.new do |ch|

    if ch == 'e'
        '3'
    elsif ch == 'a'
        '4'
    else
        ch
    end

end

prc2 = Proc.new do |ch, i|

    if i.even?
        ch.upcase
    else
        ch.downcase
    end

end

有没有办法做到这一点?

【问题讨论】:

    标签: arrays ruby proc


    【解决方案1】:

    您总是可以找出 Proc 需要多少个参数:

    def map!(&block)
      case block.arity
      when 1
        # Takes 1 argument
      when 2
        # Takes 2 arguments
      else
        # etc.
      end
    end
    

    如果您需要以特定方式处理不同的参数计数,这是一种常见的模式。

    值得注意的是,除非你需要打乱传入参数的顺序,否则你总是可以传入太多而多余的将被忽略:

    def example(&block)
      block.call(1,2,3)
    end
    
    example { |v| p v }
    # => 1
    

    【讨论】:

    • 具有各种参数(强制位置参数、带默认参数的可选位置参数、强制关键字参数、带默认参数的可选关键字参数、splat 位置参数、kwsplat 关键字参数、块参数),以及它们的顺序(例如,强制位置参数可以出现在可选位置参数之前和之后,带有默认参数和 splat 位置参数),将参数列表压缩为单个“arity”会丢失大量信息。我更喜欢Proc#parameters
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多