使Ruby对象响应双splat运算符**



我有一个库,它有一个类似的#execute方法

def execute(query, **args)
# ...
end

我有一个类,它为args(根据用户能力,它有很多逻辑(生成数据

class Abilities
def to_h
{ user: user } # and a lot more data
end
end

现在,当我使用#execute时,我总是必须记住使用#to_h,这很烦人,当有人忘记它时会导致错误:

execute(query, abilities.to_h)

所以我想知道我的Abilities类是否能以某种方式响应**(双splat(运算符,这样我就可以简单地传递对象:

execute(query, abilities)

当我试着这样称呼它时,它会抛出一个错误:

ArgumentError: wrong number of arguments (given 2, expected 1)

那么,有什么方法可以让我的Abilities类表现得像Hash吗?我可以像这个Abilities < Hash一样推导它,但我有所有的哈希逻辑,这看起来很脏。

您可以实现to_hash:(或将其定义为to_h的别名(

class MyClass
def to_hash
{ a: 1, b: 2 }
end
end
def foo(**kwargs)
p kwargs: kwargs
end
foo(MyClass.new)
#=> {:kwargs=>{:a=>1, :b=>2}}

如果将API指定为execute,使其接受任何支持to_h的内容,那么您就有了一个解决方案:

def execute(query, args = {})
args = args.to_h
...
end

相关内容

  • 没有找到相关文章

最新更新