Двойная переменная "gsub" - PullRequest
       10

Двойная переменная "gsub"

0 голосов
/ 20 ноября 2011

Можно ли использовать переменные в обоих полях метода gsub? Я пытаюсь заставить этот кусок кода работать:

$I = 0
def random_image
  $I.to_s
  random = rand(1).to_s
  logo = File.read('logo-standart.txt')
  logo_aleatoire = logo.gsub(/#{$I}/, random)
  File.open('logo-standart.txt', "w") {|file| File.puts logo_aleatoire}
  $I.to_i
  $I += 1
end

Заранее спасибо!

1 Ответ

1 голос
/ 20 ноября 2011
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 заботится о генерации нового случайного числа, когда вы встречаете новое число из исходного файла.

...