2012-12-18 89 views
-1

使用以下代碼,我期望用戶輸入"pluto""scooby",並調用該實例的speak()方法。參照基於用戶輸入的變量

class Dog 
    def speak() 
    puts "Woof" 
    end 
end 

scooby = Dog.new 
pluto = Dog.new 

puts "Which dog would you like to speak? [scooby/pluto]" 
response = gets.chomp 
response.speak() 

如果你能告訴我如何做到這一點,以及/或者稱之爲什麼,那將超越真棒。

+0

關於「你稱之爲什麼」取決於你是否真的想通過你間接計算出來的變量名(通常皺眉)來調用'speak',或者你是否只是通過名字查找的對象來調用方法。我不認爲這兩種情況都有一個爲它命名的編程模式或設計模式,但是如果知道是否存在這樣的答案,它會感興趣。 –

回答

0

大多數Ruby程序員會建議您不要嘗試按名稱查找全局變量,而是將您的狗存儲在按名稱索引的Hash中。

所以,你應該有:

kennel = {} 
kennel['scooby'] = Dog.new  
kennel['pluto'] = Dog.new 

那麼你可以說

kennel[response].speak 

當然,你可能會想防範response不是一隻狗的名字的價值狗窩;我會爲你離開這項研究。 :)

+0

哦,謝謝你的編輯。如何跛腳.... :) –

+0

哦!我沒有考慮使用散列 - 所以我也可以用用戶輸入來填充散列,並允許用戶引用它們自己創建的對象?真棒! –

+0

是的,在你的應用程序中,哈希將填充用戶輸入:輸入一個狗的名字,然後說'kennel [name] = Dog.new'等。之後你的狗可能會有更多的屬性,你甚至可以存儲他們的名稱作爲屬性。我懷疑這種模式有一個名稱;這只是一個hashmap的正常使用。你存儲的東西,按鍵查找的東西,然後對你找到的物品進行操作。如果你通過全局變量名訪問obejcts,那麼_might_可能是一個模式名稱;我只是不知道它是什麼。 「動態變量查找」,也許? –

0

可以eval用戶的輸入來獲得一個局部變量的值:

eval(response).speak() 

但是,這不是安全的。

額外的檢查是:

eval(response).speak() if local_variables.include?(response.to_sym) 

,但無論是不是安全。

+0

我還沒有真正觸及評估,所以我不知道有這麼多 - 當你說「這不安全」,我'我不知道我明白...這是一個輸入,你希望在調用eval之前進行消毒,類似於php的$ input = stripslashes($ user_input); ? –

+0

我的意思是,即使消毒,用戶的輸入也不應永遠不會被評估。 – MikDiet