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
相关产品推荐
相关产品推荐

