2012-03-13 3 views
1

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

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

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

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 
+0

Это сработало спасибо большое =) – Barbared

3

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

+0

Каждый элемент героев является объектом. Это не массив, поэтому я не могу использовать join: undefined method 'join 'для # – Barbared

+0

' Array # join' - это соглашение для записи метода экземпляра 'join' класса' Array'. – Reactormonk

+0

Прошу прощения, но я как бы новичок в рубине. Присоединение - это метод класса Array. Но герои сделаны из экземпляров класса Hero, и я не понимаю, как присоединиться к ним, поскольку они не являются массивами. – Barbared

Смежные вопросы