Могу ли я добавить атрибуты к Ruby OpenStruct на go? - PullRequest
0 голосов
/ 28 апреля 2020

Я новичок в Ruby, и это действительно базовый вопрос c, когда я искал добавление / добавление значений в OpenStruct, я не смог найти какой-либо ресурс.

Я пытаюсь чтобы обернуть тело ответа дополнительными параметрами, а код на месте использует OpenStruct. Теперь мне нужно добавить ключ / значение позже в коде перед отправкой окончательного ответа.

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

Я хочу добавить check2? : false.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Смысл OpenStruct в том, что вы можете добавлять новые поля на лету.

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

Это преимущество only , которое имеет Struct. Использование OpenStruct влечет за собой значительное снижение производительности, поэтому если вам не нужно добавлять новые поля позже, его никогда не следует использовать (если, конечно, вы абсолютно не заботитесь о производительности); вместо этого используйте Struct.

Однако, в частности, в вашем случае синтаксический анализатор Ruby не допускает методы вида check1?=, так как знак вопроса и знак равенства разрешены только в конце идентификатора; т. е. check1= является допустимым именем метода, check1? является допустимым именем метода, но check1?= не является.

tl; dr: отбросьте знак вопроса.

0 голосов
/ 28 апреля 2020

Есть два способа сделать это в зависимости от того, что лучше всего подходит для варианта использования. Можно сделать быстрое исправление с помощью чего-то вроде

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

Для справки есть хороший блог , который я получил после значительного поиска в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...