Как я могу использовать ruby ​​flat_map для сопоставления с кортежами детей и родителей - PullRequest
0 голосов
/ 26 сентября 2019

Представьте, что у вас есть массив объектов с именем parents, и каждая запись является экземпляром Parent.И представьте, что у каждого родителя есть метод с именем children, который возвращает массив Child экземпляров.Теперь представьте, что вы хотите создать flat_map от родителей к детям, но на более позднем этапе вам все равно понадобится доступ к родителю (например, для фильтрации или чего-либо еще).Как бы вы это сделали?

parents
  .flat_map { |parent| parent.children.map { |child| {parent: parent, child: child} } }

Дали бы мне то, что мне нужно, но ... фуу.Конечно, есть более рубиновый способ сделать это?Это почти похоже на слияние или объединение RX.Не могу найти рубиновый способ сделать это, кроме того, что у меня уже есть.

Вот немного рубина для генерации родительской / дочерней структуры, о которой я говорю, используя случайные данные:

class Child ; end

class Parent
  attr_reader :children

  def initialize(children)
    @children = children || []
  end
end

parents = 100.times.map do
  Parent.new(rand(10).times.map { Child.new })
end

1 Ответ

1 голос
/ 27 сентября 2019

Рассмотрите возможность принятия следующей структуры.

class Child
  attr_accessor :name # create accessor for name of child

  def initialize(name)
    @name = name
  end
end   

class Parent
  @families = {} # create class instance variable

  class << self  # change self to singleton class
    attr_reader :families # create accessor for @families
  end

  def initialize(name, children)
    self.class.families[name] = children.map { |name| Child.new(name) }
  end
end

Parent.new("Bob and Diane",     %w| Hector Lois Rudolph |)
  #=> #<Parent:0x00005ac0ddad9aa0> 
Parent.new("Hank and Trixie",   %w| Phoebe |)
  #=> #<Parent:0x00005ac0ddb252c0> 
Parent.new("Thelma and Louise", %w| Zaphod Sue |)
  #=> #<Parent:0x00005ac0ddcb2890> 

Parent.families
  #=> {"Bob and Diane"    =>[#<Child:0x00005ac0ddadf9f0 @name="Hector">,
  #                          #<Child:0x00005ac0ddadf388 @name="Lois">,
  #                          #<Child:0x00005ac0ddadf1a8 @name="Rudolph">], 
  #    "Hank and Trixie"  =>[#<Child:0x00005ac0ddb251d0 @name="Phoebe">],
  #    "Thelma and Louise"=>[#<Child:0x00005ac0ddcb27c8 @name="Zaphod">,
  #                          #<Child:0x00005ac0ddcb27a0 @name="Sue">]}

Parent.families.keys
  #=> ["Bob and Diane", "Hank and Trixie", "Thelma and Louise"]

Parent.families["Bob and Diane"].map { |child| child.name }
  #=> ["Hector", "Lois", "Rudolph"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...