我有一个库,它有一个类似的#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