【问题标题】:Can I append attributes to Ruby OpenStruct on the go?我可以在旅途中将属性附加到 Ruby OpenStruct 吗?
【发布时间】:2020-04-28 13:25:44
【问题描述】:

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

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

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

我要加check2? : false

【问题讨论】:

    标签: ruby-on-rails ruby openstruct


    【解决方案1】:

    OpenStruct 的全部意义在于您可以即时添加新字段。

    response = OpenStruct.new(
      body: 'foo',
      check1: true
    )
    response.check2 = false
    p response
    # => #<OpenStruct body="foo", check1=true, check2=false>
    

    这是它唯一优于Struct的优势。使用OpenStruct 会导致相当大的性能损失,因此如果您以后不需要添加新字段,则永远不要使用它(当然,除非您绝对不关心性能);请改用Struct

    但是,特别是在您的情况下,Ruby 的解析器不允许使用 check1?= 形式的方法,因为问号和等号都只允许在标识符的末尾;即check1= 是一个有效的方法名,check1? 是一个有效的方法名,但check1?= 不是。

    tl;dr:去掉问号。

    【讨论】:

    • 但是你可以使用 Hash 代替吗?您可以即时添加键和值,是吗?
    • @Rajagopalan 是的,您可以使用Hash。语法不同,obvi。
    【解决方案2】:

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

    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
    

    有一个good blog 供参考,这是我经过大量谷歌搜索后得到的。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2011-09-12
      • 2011-09-06
      • 1970-01-01
      • 2018-10-07
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多