filecontents = File.read('logo-standart.txt')
filecontents.gsub!(/\d+/){rand(100)}
File.open("logo-standart.txt","w"){|f| f << filecontents }
Волшебная линия - вторая строка.
- Функция
gsub!
изменяет строку на месте, в отличие от функции gsub
, которая возвращает новую строку и оставляет первую строку неизменной.
- Единственный параметр, который я передал
gsub!
, - это шаблон для сопоставления. Здесь цель состоит в том, чтобы сопоставить любую строку из одной или нескольких цифр - это число, которое вы собираетесь заменить. Нет необходимости перебирать все возможные числа, запускающие gsub на каждом. Вы можете даже сопоставить числа, такие как googol (или выше), без запуска вашей программы все дольше и дольше.
- Блок, который принимает
gsub!
, оценивается каждый раз, когда шаблон соответствует для программного генерирования номера замены. Таким образом, каждый раз вы получаете другое случайное число. Это отличается от более обычной формы gsub!
, которая принимает два параметра - там параметр оценивается один раз, прежде чем происходит любое сопоставление с образцом, и все совпадения заменяются одной и той же строкой.
Обратите внимание, что при такой структуре вы получаете новое случайное число для каждого совпадения. Поэтому, если число 307 появляется дважды, оно превращается в два разных случайных числа.
Если вы хотите каждый раз отображать 307 на одно и то же случайное число, вы можете сделать следующее:
filecontents = File.read('logo-standart.txt')
randomnumbers = Hash.new{|h,k| h[k]=rand(100)}
filecontents.gsub!(/\d+/){|match| randomnumbers[match]}
File.open("logo-standart.txt","w"){|f| f << filecontents }
Здесь randomnumbers
- это хеш, который позволяет вам искать числа и определять, какому случайному числу они соответствуют. Блок, переданный при построении хэша, сообщает хэшу, что делать, когда он находит число, которого он не видел раньше - в этом случае генерирует новое случайное число и запоминает, что это случайное число отображает. Таким образом, блок gsub!
просто просит хеш отобразить для него числа, а randomnumbers
заботится о генерации нового случайного числа, когда вы встречаете новое число из исходного файла.