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

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

1 голос
/ 13 марта 2012

Я сталкиваюсь с этим упражнением об использовании блоков 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 ]

3 голосов
/ 13 марта 2012

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

2 голосов
/ 13 марта 2012

Это кажется странным запросом, но если вам нужно использовать 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
...