2013-05-13 22 views
0

我提示用戶使用get給我peg1,peg2或peg3,每個引用提示前已經創建的數組。但是,來自用戶的輸入是一個字符串,即「peg1」,「peg2」或「peg3」。我如何讓用戶的輸入實際參考/附加到已經創建的3個數組?Ruby「gets」提示用戶輸入。如何獲得輸入(字符串)以引用現有對象?

+1

顯示您的代碼,您使用。並提供更多信息,如樣本輸入和預期輸出等。 – 2013-05-13 05:27:36

回答

1

如果您將所有可能的數組分配給由數組名稱鍵入的哈希,您可以直接詢問用戶名稱,然後從哈希中選擇數組。使用這種技術,您不需要將您的值硬編碼爲長的case聲明或(更糟糕的)eval任何東西。

def ask_for_peg(pegs) 
    peg = nil 
    while peg.nil? 
    print("Which peg do you want? ") 
    id = gets.strip 
    peg = pegs[id] 
    end 
    peg 
end 

available_pegs = { 
    "peg1" => array_for_peg1, 
    "peg2" => array_for_peg2, 
    "peg3" => array_for_peg3 
} 

selected_peg = ask_for_peg(available_pegs) 
# results in one of the arrays assigned in the available_pegs array above 
0

該數組的名稱是爲了您的利益,但不能在實際的程序中使用。所以你不能檢查輸入是否等於變量的名字。但是,您可以使用if語句if input = peg1輕鬆檢查輸入是否等於「peg1」,「peg2」或「peg3」,並在每種情況下返回適當的數組。

1

很難理解你在問什麼,但你的意思採取一些猜測,我覺得這樣的事情說明你如何做你想要什麼:

$peg1 = [:peg, :one] 
$peg2 = [:peg, :two] 
$peg3 = [:peg, :three] 

def ask_which_peg 
    print "Please choose peg1, peg2, or peg3: " 
    case gets.chomp 
    when "peg1" 
    $peg1 
    when "peg2" 
    $peg2 
    when "peg3" 
    $peg3 
    else 
    nil 
    end 
end 

peg = nil 
until(peg) 
    peg = ask_which_peg() 
end 

print peg, "\n" 
0

這也許做什麼你在問。

peg1 = ['yellow'] 
peg2 = ['blue'] 
peg3 = ['green'] 
input = gets.chomp 

input =~ /peg\d/ and 
puts eval("#{input}") 

這是充分編輯(從以前的答案),以避免評估用戶輸入爲Ruby命令。會在peg4或其他不存在的掛鉤上產生錯誤。

流量控制and有助於檢查輸入。

+0

'「#{input}」'是多餘的。你已經有一個字符串。此外,您絕不應建議人們盲目評估用戶輸入(或自己動手),因爲它會繞過您可能具有的任何安全措施。告訴人們即使是玩遊戲的例子也會使用'eval',這導致他們在後期的生產中使用它,導致代碼沒有任何安全性。 – 2013-05-13 07:07:57

+0

我知道#{}會出現。 :)我不會說它建議人們盲目評估用戶輸入時指出「我會強烈警告這一點」。但教育有其地位。知道它是可用的。這與告訴他們使用它相反。但它在那裏。 – vgoff 2013-05-13 07:32:13

+0

被評估錯誤咬得相當糟糕,我個人認爲除非沒有其他解決手頭問題的機會,否則不應該提及基於字符串的評估。如果您無法完全理解eval的含義(並且大多數人對ruby不熟悉),那麼最好避免使用它。另外,人們不會閱讀。和[StackSort](http://gkoberger.github.io/stacksort/)都不是:) – 2013-05-13 08:14:49

相關問題