ruby - 使 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
班级是否可以以某种方式响应**
(double 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}}
推荐阅读
- java - GridFS 返回的文件不完整
- angular - 在 Angular 2+ 应用程序中下载文件
- javascript - 如何在Javascript中添加多个换行符
- flutter - 从对象列表创建副本并更改新列表而不更改原始的一颤
- tabs - 我刚刚在我的代码中添加了一个新区域,但是,它现在不允许我点击其中任何一个
- java - 尝试读取 700k+ 的数据并发生错误“GC Overhead Limit Exceeded”
- python - 客户端和服务器之间的 Python 多播仅适用于它们之间的路由器
- python - 如何在 DetailView 的 post 方法中详细查看 pk?(姜戈)
- java - JPA限制子查询结果(Jhipster)
- javascript - 从模块导入并一步将对象放入另一个对象