2013-05-13 2 views
0

Я приглашаю пользователя, чтобы он дал мне либо peg1, peg2, либо peg3, в котором каждая ссылка массива уже была сделана перед приглашением. Однако вход пользователя является строкой, которая будет «peg1», «peg2» или «peg3». Как сделать вход пользователя действительно ссылкой/прикреплением к моим 3 массивам, которые уже сделаны?Ruby «получает» запрашивает пользователя для ввода. Как получить ввод (строка) для ссылки на существующий объект?

+1

показать ваш код, который вы использовали. И предоставляйте больше информации, например, входы образцов и ожидаемые выходные данные и т. Д. –

ответ

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

Имя массива для вашей выгоды, но не может использоваться в реальной программе. Таким образом, вы не можете проверить, совпадает ли вход с именем переменной. Однако вы можете легко проверить, соответствует ли вход «peg1», «peg2» или «peg3» с помощью оператора if if input = peg1 и возвращает правильный массив в каждом случае.

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

Это возможно делать то, что вы спрашивают.

Это достаточно отредактированный (из предыдущего ответа), чтобы избежать использования пользовательского ввода в качестве команды Ruby. Вызов ошибки на peg4 или другой привязке, которая не существует.

Управление потоком and помогает проверять входы.

+0

'' # {input} "' избыточно. У вас уже есть строка. Кроме того, вы никогда не должны советовать людям слепо оценивать ввод пользователя (или делать это самостоятельно), поскольку он обходит любые меры безопасности, которые могут возникнуть у вас. Говорить людям о том, чтобы использовать 'eval' даже для игровых примеров, приводит их к использованию в дальнейшем, в результате чего код без какой-либо безопасности. –

+0

Я знал, что что-то пришло. :) Я бы не назвал это советом, чтобы люди слепо оценивали ввод пользователя, заявляя, что «я бы настоятельно предупреждал об этом». Но образование имеет свое место. Зная, что он доступен. Это было бы противоположно тому, чтобы говорить им об этом. Но он есть. – vgoff

+0

Будучи довольно укушенными ошибками eval, я лично думаю, что вы даже не должны упоминать строковую оценку, если нет другого шанса решить проблему. Если вы не можете полностью понять последствия eval (и большинство людей, новых для рубинов, не могут), лучше избегать этого. Кроме того, люди не читают. И [StackSort] (http://gkoberger.github.io/stacksort/) ни :) –

 Смежные вопросы

  • Нет связанных вопросов^_^