2011-11-20 2 views
0

gsub 메서드의 두 필드에서 변수를 사용할 수 있습니까? 사전에더블 "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

여기에 어떤 질문이 있는지 이해할 수는 없지만 코드에 대한 3 가지 메모가 있습니다. 우선 'to_s'및 'to_i'에는 부작용이 없으므로 반환 값을 사용하지 않고 호출하면 아무 것도 수행되지 않습니다 조금도. '$ Ito_s'와'$ Ito_i' 줄을 제거하면 코드가 똑같은 방식으로 동작합니다. 둘째, 'rand (1)'은 0이 1보다 작은 유일한 음수가 아니므로 항상 0을 반환합니다. 세 번째로 전역 변수를 사용하는 것은 잘못된 스타일입니다. 이것은 카운터가 전역 적으로 대신 인스턴스별로 유지되는 클래스로 이동해야합니다. – sepp2k

+0

오, 아마도'file.puts'을 쓸 때'File.puts'을 썼습니다. -'File.puts' 메소드가 없습니다. – sepp2k

+0

신속하고 완전한 답변을 보내 주셔서 감사합니다! =) 나는 내 질문에 대해 더 잘 설명하려고 노력할 것이다. 나는 1에서 x까지의 숫자를 가진 파일을 가지고 있고 그 파일의 모든 숫자는 무작위 이진 값 (0 또는 1)으로 바뀌길 원한다. 그래서 나는 모든 값을 (0에서 x까지) 취할 수 있도록 "I"를 반복하려고했다. –

답변

1
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은 원본 파일에서 새 번호를 발견하면 새로운 임의의 번호를 생성합니다.

+0

Ouaou 감사합니다! 그것은 효과가있다! 코드를 이해하는 데 시간이 좀 걸릴 테지만 감사합니다! –

+0

나는 더 설명하기 위해 답을 편집 할 것이다. –