Ruby 快捷方式,用于仅将预期数量的参数传递给 lambda

问题描述 投票:0回答:1

下面的代码是否有一个快捷方式,仅将预期数量的参数(“arity”)传递给 lambda(并忽略其余部分)?

args = [:p1, :p2, :p3, :p4, :p5, :p6]
expected_args = args[0...the_lambda.arity]
value = the_lambda.call(*expected_args)

总体来说,我正在编写一个 Ruby 程序,用户可以在其中编写包含 lambda 的 Ruby 配置文件。我希望用户能够仅使用所需的参数来编写这些 lambda(无需进行“额外”输入,例如包含不会使用的参数)。

用户可以使用上面的代码编写

my_override = ->(a) {....}

my_override = ->(a, b, c) { ....}

编译器不会抱怨。 (这里的部分想法是,在教授新用户时,我们甚至不需要提及超过一两个参数的事实。我们可以简单地“保存”这些额外的功能,以便向更高级的用户展示。 )最终目标是使 lambda 的编写尽可能简单——这意味着避免用户编写的代码中出现不直接影响 lambda 功能的元素。

ruby lambda variadic-functions
1个回答
0
投票

也许不是答案,但作为评论很难阅读。

一般来说,我同意使用选项哈希的评论,但是您可以通过包装“用户 lambda”并将参数传递到方法调用中来简化您的请求,如下所示

def lambda_wrapper(user_lambda,*args,**kwargs)
  req_args,opt_args, req_kwargs,opt_keys = user_lambda.parameters.group_by(&:shift).transform_values(&:flatten).values_at(:req,:opt,:keyreq,:key)
  user_lambda.call(*args.first(req_args.size + opt_args.size),**kwargs.slice(*req_kwargs.concat(opt_keys)))
end

此方法将收集 lambda 的参数和关键字参数,然后通过从传递给包装器的参数中提取这些参数来调用用户 lambda。

示例:

user_lambda = ->(a,b,c,d=57, e:, f:,g:92) {[a,b,c,d,e,f,g]}
lambda_wrapper(user_lambda,1,2,3,e:12,f:17)
#=> [1,2,3,57,12,17,92]
lambda_wrapper(user_lambda,1,2,3,4,e:12,f:17,g:101)
#=> [1,2,3,4,12,17,101]
lambda_wrapper(user_lambda,1,2,3,4,5,6,e:12,f:17,x:88)
#=> [1,2,3,4,12,17,92]

如果您想让用户 lambda 确认

*
(
:rest
) 和
**
(
:keyrest
),您还需要将该分段添加到方法中。

© www.soinside.com 2019 - 2024. All rights reserved.