2016-04-20 27 views
0

嗨我有一些數據結構的問題。 讓我們想想一個有很多孩子的男人,但一個孩子只能有一個父親。所以孩子知道他的父親,父親知道他所有的孩子。 我想使用to_s方法來創建一個答案,取決於誰在問一個班級。 我發現caller代表實際的堆棧。我必須用它來產生這個決定(接縫完美,因爲不需要寶石)。ruby​​:獲取調用者類

請告訴我的問題:我不知道如何如何決定浩呼籲,看看這個類:

class child 
    ... 
    def to_s 
     str = "I'm " 
     str += @first_name 
     str += @last_name 
     str += " my dad is" 
     str += @father.to_s 
    end 
    end 

class dad 
    ... 
    def to_s 
     str = "I'm " 
     str += @first_name 
     str += @last_name 
     str += " my childs are" 
     @kids.each{|child| str+= child.to_s} 
    end 
    end 

如果child電話to_sdad比如,它應該只返回名稱,其他如果一個dad調用他的child的實例之一,它也應該返回名稱。 我的起源問題更復雜,所以爲了解決這個問題,我必須在這種情況下阻止無限遞歸。

我該如何與來電者的課程進行比較?

+3

實現一個單獨的'name'方法和用途「'我爸是#{father.name}「'和'」我的孩子是#{kids.map(&:name).join(',')}'' – Stefan

+0

當調用函數時,您可以傳遞'self'作爲參數,以便被調用者具有對調用者的引用 –

回答

0

剛剛通過父實例創建子項時如何? 以下是粗略的,但它的工作原理。

class Child 

    attr_accessor :father, :first_name, :last_name 

    def initialize(father, first_name) 
    @father = father 
    @first_name = first_name 
    @last_name = father.last_name 
    end 

    def to_s 
    "I'm #{first_name} #{last_name} my dad is #{father.first_name} #{father.last_name}" 
    end 
end 


class Dad 

    attr_accessor :kids, :first_name, :last_name 

    def initialize(first_name, last_name) 
    @first_name = first_name 
    @last_name = last_name 
    @kids = [] 
    end 

    def make_kid(first_name) 
    kids << Child.new(self, first_name) 
    end 

    def to_s 
    "I'm #{first_name} #{last_name} my childs are #{kids.map(&:first_name).join(', ')}" 
    end 
end 

dad = Dad.new 'OShea', 'Jackson' 
dad.make_kid 'Darrell' 
dad.make_kid 'Tommy' 

dad.to_s 
# => "I'm OShea Jackson my childs are Darrell, Tommy" 

dad.kids.first.to_s 
# => "I'm Darrell Jackson my dad is OShea Jackson" 
0

您可以將參數傳遞給打破遞歸:

def to_s skip_recursion=false 
    return "#{first_name} #{last_name}" if skip_recursion 
    # then goes as before 
    # ... 
    str += " my dad is" 
    str += @father.to_s(true) 
end 

但這其實會像一個單獨的方法name