Ruby - 如何编写接受具有不同数量参数的过程的方法?
Ruby - How to write a method that accepts a proc with varying numbers of params?
我正在 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
有办法吗?
你总能查出 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
我正在 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
有办法吗?
你总能查出 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