2011-11-20 53 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

我真的不明白這裏的問題是什麼,但是這裏有關於你的代碼的三個注意事項:首先'to_s'和'to_i'沒有副作用,所以在不使用返回值的情況下調用它們什麼也不做在所有。如果你刪除了'$ I.to_s'和'$ I.to_i'這兩行,你的代碼的行爲將完全相同。其次'rand(1)'將總是返回0,因爲0是唯一的小於1的非負整數。第三,使用全局變量的方式是不好的風格。這可能會進入一個類,其中一個計數器保持每個實例而不是全局。 – sepp2k

+0

呵呵,你在寫'File.puts'時寫了'File.puts' - 沒有'File.puts'方法。 – sepp2k

+0

感謝您的快速和完整的答案! =)我會試着更好地解釋我的問題。我有一個數字從1到x(比如500)的文件,我希望該文件中的每個數字都被一個隨機二進制值(0或1)替換。所以我嘗試迭代「I」,以便它可能需要每個值(從0到x)。 –

回答

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

我將編輯答案以進一步解釋。 –