1

我是 Ruby 新手,这是一个非常基本的问题,当我搜索向 OpenStruct 添加/附加值时,我找不到任何资源。

我正在尝试用额外的参数包装响应主体,并且到位的代码使用 OpenStruct。现在,在发送最终响应之前,我需要稍后在代码中附加一些键/值。

OpenStruct.new(
  body : api_response.body
  check1? : true
) 

我想补充check2? : false

4

2 回答 2

2

的全部意义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:去掉问号。

于 2020-04-28T14:21:49.153 回答
0

有两种方法可以做到这一点,具体取决于最适合用例的方法。一个人可以用这样的东西做一个快速修复

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

有一个很好的博客供参考,经过大量谷歌搜索后得到。

于 2020-04-28T13:25:44.460 回答