2013-10-06 97 views
0

開始了我的河內分配塔,我有一個字符串(從獲得)直接作爲變量名

a = [6,5,4,3,2,1] 
b = []  
c = [] 

puts "Type a, b, or c" 
from = gets.chomp 
# the user types a lower-case a 
popped = from.pop 

現在這顯然失敗了,因爲流行音樂是不是一個字符串的方法。

所以比

if from == a 
    popped = a.pop 
elsif from == b 
    popped = b.pop 

等,有一個漂亮的紅寶石快捷得到彈出我打算?

+0

是'a = [6,5,4,3,2,1]'用戶輸入嗎?請更清楚程序是什麼以及用戶輸入是什麼。 –

+0

問題已修復。關鍵信息被刪除之前。 – dwilbank

+0

那麼你可以做一個'case'語句,但是這和你的'if'是一樣的。據我所知,沒有捷徑可以讓字符串輸入等同於變量名稱。 (P.S.它應該是'if from == a' not single =)。 – MitulP91

回答

0

您可以使用eval

a = [6,5,4,3,2,1] 
b = []  
c = [] 

puts "Type a, b, or c" 
from = gets.chomp 
popped = eval(from).pop 

eval通常被視爲安全性,性能和調試的原因是一個壞主意。

+1

我會調查這個評估業務,不幸的是,必須避免它。謝謝 – dwilbank

+0

我的回答下面是eval的更安全的替代方案。 –

+0

+1無論「eval」是個好主意還是不在這裏,瑞奇都回答了這個問題,而且是唯一一個這樣做的人。我不相信downvote是合理的。 –

0
options = { 
    :a => [6,5,4,3,2,1] 
    :b => []  
    :c => [] 
} 

puts "Type a, b, or c" 
from = gets.chomp 
popped = options[from.to_sym].pop 

我必須強烈建議你避免使用上述使用eval的方法的,因爲它允許用戶輸入任意代碼。使用散列代替存儲所有選項。

+1

只要我們在談論安全問題,使用to_sym實習未知字符串也是一種糟糕的形式,因爲它容易受到拒絕服務攻擊。當然,在這種情況下,這不是一個問題。我只是挑剔。 – Joel