2013-09-27 26 views
2

我有一個類,名爲Family Members,其中包含的屬性(文件family_members.rb中),例如namesextyperole,和age動態調用上的類的一個實例的方法(用戶指定動態地實例名)

我創建了一個實例,名爲fm1fm2fm3fm4fm5

#family_members.rb 

require_relative 'family' 
require_relative 'checkdetails' 

class FamilyMembers < Family 

    attr_accessor :name, :sex, :status, :age 
    def initialize (name, sex, type, role, age) 
    @name = name 
    @sex = sex 
    @type = type 
    @role = role 
    @age = age 
    end 

end 

fm1 = FamilyMembers.new('Andrew','Male', 'Child', "Son" , "27") 
fm2 = FamilyMembers.new("Bill","Male", "Parent", "Father" , "63") 
fm3 = FamilyMembers.new("Samantha","Female", "Parent", "Mother" , "62") 
fm4 = FamilyMembers.new("Thomas","Male", "Child", "Dog" , "10") 
fm5 = FamilyMembers.new("Samantha", 'Female', "Child", "Dog" , "4") 

我有一個名爲Parent?方法來檢查一個類的實例是否爲ParentChild,並且它被稱爲如下:

#check_details //would like to use this method 

fm4.parent? 

難道對於用戶是可能的動態選擇要檢查的類的哪個實例?

我創建了一個方法,在checkdetails.rb文件名爲check_details

#checkdetails.rb 

def check_details 
    puts "What family to you want to check? choose 1 to 5" 
    $family = 'fm' + gets.chomp 
end 

但是,如果我嘗試調用parent方法是這樣的:

check_details 

$family.parent? 

它給了我下面的錯誤:

`<top (required)>': undefined method `parent?' for "fm1":String (NoMethodError) 
    from -e:1:in `load' 
    from -e:1:in `<main>' 

有沒有辦法做到這一點動態?可能沒有全局變量 - 這被認爲是不好的做法?

感謝您的任何幫助。

+1

你可以做你想做的事情。勾選['Kernel#eval'](http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-eval)方法。在這種情況下,您的代碼將如下所示:'num = gets.chomp; eval(「fm#{num} .parent?」)'但是最好使用'FamilyMembers'的'Array' /'Hash' – Featalion

回答

0

將您的FamilyMembers存儲在數組或散列中,然後按鍵查找它們。

fm = {} 
fm[1] FamilyMembers.new('Andrew','Male', 'Child', "Son" , "27") 
fm[2] = FamilyMembers.new("Bill","Male", "Parent", "Father" , "63") 
fm[3] = FamilyMembers.new("Samantha","Female", "Parent", "Mother" , "62") 
fm[4] = FamilyMembers.new("Thomas","Male", "Child", "Dog" , "10") 
fm[5] = FamilyMembers.new("Samantha", 'Female', "Child", "Dog" , "4") 

answer = "3" # get this from the user. 
num = answer.to_i 

if fm.key?(num) 
    fm[num].parent? 
else 
    raise 'Invalid answer' 
end 

P.S. Ruby指導方針將建議「家庭成員」班應稱爲「家庭成員」。

+0

謝謝,很快就會試試! – Tom

+0

感謝這個作品,我會接受你的答案。然而,我試圖把所有的代碼放在另一個文件中叫做check_details的方法中,但是它不會讓我調用它,錯誤信息是'未定義的局部變量或方法'check_details'for main:Object(NameError)' ..這很奇怪,因爲我可以從這個文件中調用其他方法。你有什麼想法嗎?謝謝 – Tom

+0

@Jenny Nope。它不能在需要時加載。祝你好運! –