2012-03-13 10 views
1

ブロックを使用して約と呼んでこの練習問題を実行すると、と表示されます。それは次のようになります。Ruby:ブロックと利回り

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

私は、一般的にブロックし、歩留まりを使用する方法を知っている:

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 

戻り値は次のようになります。私はこれの前に非常に簡単な演習をしましたが、私はこの問題を解決することはできません。

答えて

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を使うことができません。# – Barbared

+0

の 'join 'は未定義です。' Array#join'はクラス 'Array'の' instance method' join 'を書くための規約です。 – Reactormonk

+0

申し訳ありませんが、私はルビーの初心者です。 JoinはArrayクラスのメソッドです。しかしヒーローはヒーロークラスのインスタンスで作られており、配列ではないので、私はそれらを結合する方法を得ていません。 – Barbared

関連する問題