You need to enable JavaScript to run this app. Ruby中调用send方法时参数被包裹为Hash的原因及解决办法
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中调用send方法时参数被包裹为Hash的原因及解决办法

问题原因

你调用send方法时使用了name_of_openstruct_param: my_open_struct的关键字参数语法,而目标方法my_method_that_takes_an_openstruct是按位置参数定义的,没有声明对应名称的关键字参数。
Ruby会自动把未被方法声明接收的所有关键字参数,打包为单个Hash对象作为位置参数传入目标方法,因此你在方法内部拿到的就是包裹了键值对的Hash结构。

解决方法

根据你的方法设计选其中一种方案即可:

  • 方案1:保持方法的位置参数定义,修改send调用写法,直接传OpenStruct对象,不要加键名
my_open_struct = OpenStruct.new(foo: "foo")

result = @my_object.send(
            :my_method_that_takes_an_openstruct,
            my_open_struct)

修改后方法内部拿到的参数就是直接的OpenStruct对象。

  • 方案2:保持当前send的调用写法,修改目标方法的定义,声明接收对应名称的关键字参数
# 调整方法定义为关键字参数形式
def my_method_that_takes_an_openstruct(name_of_openstruct_param:)
  # 此处直接拿到的就是OpenStruct对象
  puts name_of_openstruct_param
end

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 07:09:00