Я приглашаю пользователя, чтобы он дал мне либо peg1, peg2, либо peg3, в котором каждая ссылка массива уже была сделана перед приглашением. Однако вход пользователя является строкой, которая будет «peg1», «peg2» или «peg3». Как сделать вход пользователя действительно ссылкой/прикреплением к моим 3 массивам, которые уже сделаны?Ruby «получает» запрашивает пользователя для ввода. Как получить ввод (строка) для ссылки на существующий объект?
ответ
Если вы присваиваете все возможные массивы хэшу с именем массива, вы можете просто попросить пользователя для этого имени и затем выбрать массив из хэша. Используя эту технику, вы не должны жестко кодировать свои значения в длинном 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
Имя массива для вашей выгоды, но не может использоваться в реальной программе. Таким образом, вы не можете проверить, совпадает ли вход с именем переменной. Однако вы можете легко проверить, соответствует ли вход «peg1», «peg2» или «peg3» с помощью оператора if if input = peg1
и возвращает правильный массив в каждом случае.
Это трудно понять, что вы просите, но принимая некоторые догадки на то, что вы имеете в виду, я думаю, что-то вроде этого показывает вам, как сделать то, что вы хотите:
$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"
Это возможно делать то, что вы спрашивают.
Это достаточно отредактированный (из предыдущего ответа), чтобы избежать использования пользовательского ввода в качестве команды Ruby. Вызов ошибки на peg4 или другой привязке, которая не существует.
Управление потоком and
помогает проверять входы.
'' # {input} "' избыточно. У вас уже есть строка. Кроме того, вы никогда не должны советовать людям слепо оценивать ввод пользователя (или делать это самостоятельно), поскольку он обходит любые меры безопасности, которые могут возникнуть у вас. Говорить людям о том, чтобы использовать 'eval' даже для игровых примеров, приводит их к использованию в дальнейшем, в результате чего код без какой-либо безопасности. –
Я знал, что что-то пришло. :) Я бы не назвал это советом, чтобы люди слепо оценивали ввод пользователя, заявляя, что «я бы настоятельно предупреждал об этом». Но образование имеет свое место. Зная, что он доступен. Это было бы противоположно тому, чтобы говорить им об этом. Но он есть. – vgoff
Будучи довольно укушенными ошибками eval, я лично думаю, что вы даже не должны упоминать строковую оценку, если нет другого шанса решить проблему. Если вы не можете полностью понять последствия eval (и большинство людей, новых для рубинов, не могут), лучше избегать этого. Кроме того, люди не читают. И [StackSort] (http://gkoberger.github.io/stacksort/) ни :) –
показать ваш код, который вы использовали. И предоставляйте больше информации, например, входы образцов и ожидаемые выходные данные и т. Д. –