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
은 원본 파일에서 새 번호를 발견하면 새로운 임의의 번호를 생성합니다.
여기에 어떤 질문이 있는지 이해할 수는 없지만 코드에 대한 3 가지 메모가 있습니다. 우선 'to_s'및 'to_i'에는 부작용이 없으므로 반환 값을 사용하지 않고 호출하면 아무 것도 수행되지 않습니다 조금도. '$ Ito_s'와'$ Ito_i' 줄을 제거하면 코드가 똑같은 방식으로 동작합니다. 둘째, 'rand (1)'은 0이 1보다 작은 유일한 음수가 아니므로 항상 0을 반환합니다. 세 번째로 전역 변수를 사용하는 것은 잘못된 스타일입니다. 이것은 카운터가 전역 적으로 대신 인스턴스별로 유지되는 클래스로 이동해야합니다. – sepp2k
오, 아마도'file.puts'을 쓸 때'File.puts'을 썼습니다. -'File.puts' 메소드가 없습니다. – sepp2k
신속하고 완전한 답변을 보내 주셔서 감사합니다! =) 나는 내 질문에 대해 더 잘 설명하려고 노력할 것이다. 나는 1에서 x까지의 숫자를 가진 파일을 가지고 있고 그 파일의 모든 숫자는 무작위 이진 값 (0 또는 1)으로 바뀌길 원한다. 그래서 나는 모든 값을 (0에서 x까지) 취할 수 있도록 "I"를 반복하려고했다. –