Рубин: блоки и выход

Я сталкиваюсь с этим упражнением об использовании блоков e, затем вызываю их с помощью yield. Это выглядит так:

class Hero
  def initialize(*names)
    @names = names
  end
  def full_name
    # a hero class allows us to easily combine an arbitrary number of names
    # this is where yield should be
  end
end

def names
  heroes = [Hero.new("Christopher", "Alexander"),
            Hero.new("John", "McCarthy"),
            Hero.new("Emperor", "Joshua", "Abraham", "Norton")]
  # I have to use #map and #join to unify names of a single hero
end

Возвращаемое значение должно выглядеть так:

["Christopher Alexander", "John McCarthy", "Emperor Joshua Abraham Norton"]

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

2 ответа

Решение

Это кажется странным запросом, но если вам нужно использовать yield и join, как вы пишете в комментариях, это решение:

class Hero
  def initialize(*names)
    @names = names
  end
  def full_name
    if block_given?
      yield @names
    else
      @names.join(' ')
    end
  end
end

def names
  heroes = [Hero.new("Christopher", "Alexander"),
            Hero.new("John", "McCarthy"),
            Hero.new("Emperor", "Joshua", "Abraham", "Norton")]
  heroes.map { |h| h.full_name { |name| name.join(' ') } }
end

Используйте Array # join. Вам не нужно yield или какие-нибудь модные вещи.

Другие вопросы по тегам