2013-04-04 40 views
2

說我的程序,是這樣的:在GSUB使用一個不同的結果插入的每個實例

my_string = "I think we should implement <random_plan> instead of <random_plan>" 


def generate_random_plan 

    #Some code that returns a string that is not the same every time the method is called, involving randomness. 

end 

puts my_string.gsub("<random_plan>", generate_random_plan) 

所以當我寫它,它會打印類似「我認爲我們應該實施計劃H而不是計劃H「。當我真正想要的是gsub每次執行替換時調用該方法,所以我最終可以結束「我認爲我們應該實現計劃D而不是計劃Q」。我有一個偷偷摸摸的gsub方法只是不是建立的,它不能完成,所以你可以建議最簡單的方法來做到這一點?

回答

4

Ruby中的一個基本原則是「如果有疑問,請嘗試一個代碼塊」。實際上,gsub()接受代碼塊代替其第二個參數的字符串。

這裏是一個有點像一個例子,你要尋找的東西:

'axbxcxdxe'.gsub('x') { rand(9) } 

嘗試的代碼在irb,你會得到隨機數字對於X:

a0b6c0d3e 

更換代碼塊是一個強大的功能,特別是因爲它接收原始匹配的字符串作爲參數。作爲一個人爲的例子,假設你想只元音轉換成字符串爲大寫:

def vowelup(s) 
    s.gsub(/[aeiouy]/) { |c| c.upcase } 
end 

print vowelup('Stack Overflow') 

此打印:

StAck OvErflOw 

JavaScript有本質上過於相同的特徵:

function vowelup(s) { 
    return s.replace(/[aeiouy]/g, function(c) { 
     return c.toUpperCase(); 
    }); 
} 

console.log(vowelup('Stack Overflow')); 
+0

爲什麼rand(9)'?不是2,3等 – 2013-04-04 08:42:34

+0

這只是一個例子,顯示'gsub'如何調用一個塊,並且你可以在該塊中調用一個函數,比如'rand()'。實際數字並不重要。當然,實際的代碼與OP想要的隨機響應有關。 – 2013-04-04 08:46:33

+0

「axbxcxdxe'.gsub('x')'和''axbxcxdxe'.gsub('x'){rand(9)}'之間的差異是什麼? – 2013-04-04 08:48:29

0

gsub接受一個塊,如果有的話,在每場比賽中調用它。從它返回你的隨機值。

my_string = "I think we should implement <random_plan> instead of <random_plan>" 

def generate_random_plan s 
    plans = ('A'..'Z').to_a 
    s.gsub('<random_plan>') do 
    plans.sample # random plan 
    end 
end 

generate_random_plan my_string # => "I think we should implement A instead of J" 
generate_random_plan my_string # => "I think we should implement Q instead of A" 
generate_random_plan my_string # => "I think we should implement Z instead of H" 
相關問題