Kod, który Twoim zdaniem nie działa, działa:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Sprawy stają się bardziej interesujące, jeśli zmienna może zawierać metaznaki wyrażenia regularnego. Jeśli tak i chcesz, aby te znaki matematyczne robiły to, co zwykle robią w wyrażeniu regularnym, zadziała ten sam gsub:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
Jeśli jednak wyszukiwany ciąg zawiera metaznaki i nie chcesz, aby były one interpretowane jako metaznaki, użyj Regexp.escape w następujący sposób:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Lub po prostu podaj gsub ciąg znaków zamiast wyrażenia regularnego. W MRI> = 1.8.7, gsub potraktuje argument zastępujący ciąg jako zwykły ciąg, a nie wyrażenie regularne:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(Kiedyś było tak, że argument zastępujący ciąg znaków w gsub był automatycznie konwertowany na wyrażenie regularne. Wiem, że tak było w 1.6. Nie pamiętam, która wersja wprowadziła zmianę).
Jak wspomniano w innych odpowiedziach, możesz użyć Regexp.new jako alternatywy dla interpolacji:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"