我是 Ruby 新手,这是一个非常基本的问题,当我搜索向 OpenStruct 添加/附加值时,我找不到任何资源。
我正在尝试用额外的参数包装响应主体,并且到位的代码使用 OpenStruct。现在,在发送最终响应之前,我需要稍后在代码中附加一些键/值。
OpenStruct.new(
body : api_response.body
check1? : true
)
我想补充check2? : false
。
我是 Ruby 新手,这是一个非常基本的问题,当我搜索向 OpenStruct 添加/附加值时,我找不到任何资源。
我正在尝试用额外的参数包装响应主体,并且到位的代码使用 OpenStruct。现在,在发送最终响应之前,我需要稍后在代码中附加一些键/值。
OpenStruct.new(
body : api_response.body
check1? : true
)
我想补充check2? : false
。
的全部意义OpenStruct
在于您可以动态添加新字段。
response = OpenStruct.new(
body: 'foo',
check1: true
)
response.check2 = false
p response
# => #<OpenStruct body="foo", check1=true, check2=false>
这是它唯一的优势Struct
。使用OpenStruct
会导致相当大的性能损失,因此如果您以后不需要添加新字段,则永远不应使用它(当然,除非您绝对不关心性能);改为使用Struct
。
但是,特别是在您的情况下,Ruby 的解析器不允许使用 form 方法check1?=
,因为问号和等号都只允许在标识符的末尾;iecheck1=
是一个有效的方法名,check1?
是一个有效的方法名,但check1?=
不是。
tl; dr:去掉问号。
有两种方法可以做到这一点,具体取决于最适合用例的方法。一个人可以用这样的东西做一个快速修复
openstruct_object.check2? = false
或者一种优雅的方法是将 OpenStruct 实例的创建包装在一个接受check2?
参数的方法中。(这就是我所做的,它适用于命名参数!)
def wrap_reponse(body, check1 = "your_default", check2: "named_args")
OpenStruct.new(
body : body,
check1? : true,
check2? : false
)
end
有一个很好的博客供参考,经过大量谷歌搜索后得到。