Ruby中仅向Lambda传递预期参数数量的快捷方式是否存在?
Ruby中按Lambda参数数量传递参数的快捷实现
基础快捷写法
对应你给出的代码逻辑,Ruby的Array#take方法可以替代数组切片,让代码更简洁:
value = the_lambda.call(*args.take(the_lambda.arity))
take(n)会返回数组的前n个元素,和args[0...n]的效果完全一致,代码更直观易读。
处理带默认参数的Lambda
如果用户编写的Lambda包含默认参数(比如->(a, b=5) { ... }),此时the_lambda.arity会返回负数(上述例子返回-2),直接用take会取前-2个元素(即空数组),不符合预期。这种情况下需要先处理arity的值:
required_args_count = the_lambda.arity < 0 ? -the_lambda.arity - 1 : the_lambda.arity value = the_lambda.call(*args.take(required_args_count))
这样可以正确提取Lambda要求的必选参数数量,确保带默认参数的Lambda也能正常接收必要参数。
更灵活的调用方式
如果你希望Lambda能接收所有它能处理的参数(包括可选参数),可以用lambda#parameters获取参数定义,动态提取对应数量的参数:
param_count = the_lambda.parameters.count { |type, _| type != :block } value = the_lambda.call(*args.take(param_count))
parameters方法会返回Lambda的参数类型列表(比如[[:req, :a], [:opt, :b]]),过滤掉块参数后统计数量,就能准确获取Lambda定义的所有参数(必选+可选)的总数,传递对应数量的参数。
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

