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 }
Here, randomnumbers
is a hash that lets you look up the numbers and find what random number they correspond to. The block passed when constructing the hash tells the hash what to do when it finds a number that it hasn't seen before -- in this case, generate a new random number, and remember what that random number the mapping. So gsub!
's block just asks the hash to map numbers for it, and randomnumbers
takes care of generating a new random number when you encounter a new number from the original file.