Ruby создать ха sh содержимое с помощью вызова методов - PullRequest
1 голос
/ 03 апреля 2020

Ниже приведены методы, из которых я хочу построить ха sh:

методы:

def support_board
  { 'project' => { 'id' => '1234' } }
end

def security_board
  { 'project' => { 'id' => '4352' } }
end

def project_setup
  { 'customfield_12345' => 'None' }
end

ожидаемое га sh:

{
  'fields' => {
    'project' => { 'id' => '1234' },
    'issuetype' => { 'id' => '4352' },
    'customfield_12345' => 'None'
  }
}

Я пытался что-то вроде:

{
  'fields' => {
    support_board,
    security_board,
    project_setup
  }
}

Но это неправильный синтаксис, я получаю несколько ошибок в консоли - unexpected tSTRING_DEND, expecting end-of-input

Ответы [ 3 ]

2 голосов
/ 03 апреля 2020

Вы получаете синтаксическую ошибку, потому что вам нужно предоставить ключи при построении ха sh.

, это ужасно, но рабочий пример, который поможет вам преодолеть проблему синтаксиса, может выглядеть примерно так :

{
  'fields' => {
    support_board.keys.first => support_board[support_board.keys.first]
  },
}

Но это предполагает, что хэши, возвращаемые методами, имеют только одну пару ключ / значение.

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

Пример:

def support_board
  {
    name: 'project',
    value: { 'id' => '1234' }
  }
end

Тогда вы можете сделать что-то вроде этого ...

{
  'fields' => {
    support_board[:name] => support_board[:value],
    security_board[:name] => security_board[:value],
  },
}
2 голосов
/ 03 апреля 2020

Вы можете использовать Hash#merge! для объединения значений в:

{ "fields" => {} }.tap do |return_value|
  return_value['fields'].merge!(support_board, security_board, project_setup)
end
# => {"fields"=>{"project"=>{"id"=>"1234"},
# =>    "issuetype"=>{"id"=>"4352"}, "customfield_12345"=>"None"}}

Или, в более старых ruby версиях, делая это по одному:

[
  support_board,
  security_board,
  project_setup
].each_with_object({'fields' => {}}) do |method_call, return_value|
  return_value['fields'].merge!(method_call)
end
# => same as above
1 голос
/ 03 апреля 2020

Решение с 1 вкладышем (при условии, что в методе security_board есть опечатка):

{
  'fields' => [support_board, security_board, project_setup].reduce(&:merge)
}

В этом 1-вкладыше есть что переварить. Возможно, вы захотите провести исследование по следующим вопросам (все ссылки ссылаются на ruby -do c .org):

Ну и документация из Symbol#to_proc слишком просто. Согласно моему опыту, реализация Symbol#to_proc может выглядеть так:

class Symbol
  def to_proc
    proc {|obj, *args| obj.send(self, *args)}
  end
end

Кстати, он также работает без оператора &.

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