Рубин: блоки и выход
Я сталкиваюсь с этим упражнением об использовании блоков 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
или какие-нибудь модные вещи.