gpt4 book ai didi

ruby - 使用关键字参数确定方法的数量

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:44 24 4
gpt4 key购买 nike

我正在开发一个 Ruby 应用程序,我在其中动态调用基于 JSON 数据的方法。松散地:

def items
# do something
end

def createItem( name:, data:nil )
# do something that requires a name keyword argument
end

def receive_json(json) # e.g. { "cmd":"createItem", "name":"jim" }
hash = JSON.parse(json)
cmd = hash.delete('cmd')
if respond_to?(cmd)
params = Hash[ hash.map{ |k,v| [k.to_sym, v } ]
method(cmd).arity==0 ? send(cmd) : send(cmd,params)
end
end

如上所示,有些方法不带参数,有些方法带关键字参数。在 Ruby 2.1.0(我正在开发的地方)下,上述两种方法的 arity 都是 0。但是,如果我总是send(cmd,params),我会收到不带参数的方法的错误。

我如何使用 send 在需要时正确传递关键字参数,而在不需要时忽略它们?

最佳答案

使用 parameters而不是 arity 似乎可以满足我的需求:

method(cmd).parameters.empty? ? send(cmd) : send(cmd,opts)

深入了解参数返回值的丰富性:

def foo; end
method(:foo).parameters
#=> []

def bar(a,b=nil); end
method(:bar).parameters
#=> [[:req, :a], [:opt, :b]]

def jim(a:,b:nil); end
method(:jim).parameters
#=> [[:keyreq, :a], [:key, :b]]

这是一个通用方法,它只挑选出你的方法支持的那些命名值,以防你的散列中有额外的键,这些键不是该方法使用的关键字参数的一部分:

module Kernel
def dispatch(name,args)
keyargs = method(name).parameters.map do |type,name|
[name,args[name]] if args.include?(name)
end.compact.to_h
keyargs.empty? ? send(name) : send(name,keyargs)
end
end

h = {a:1, b:2, c:3}

def no_params
p :yay
end

def few(a:,b:99)
p a:a, b:b
end

def extra(a:,b:,c:,z:17)
p a:a, b:b, c:c, z:z
end

dispatch(:no_params,h) #=> :yay
dispatch(:few,h) #=> {:a=>1, :b=>2}
dispatch(:extra,h) #=> {:a=>1, :b=>2, :c=>3, :z=>17}

关于ruby - 使用关键字参数确定方法的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com