/ / Ako sa program „gsub“ líši od programu „gsub!“, Keď na nahradenie jeho hodnôt používa ako vzory hash kľúč? [closed] - rubín, regulárny výraz, hash

Ako sa `gsub` líši od` gsub! `Pri použití kľúča hash ako vzoru na náhradu jeho hodnôt? [uzavretý] - rubín, regex, hash

použil som gsub! nahradiť zápas hashovacím kľúčom jeho hash hodnotou. Napríklad:

def replace_string(string = "@ReplaceMe[xyz]@@ReplaceMe[123]@Hello")
generator_replacements = {
"@ReplaceMe[xyz]@" => "Time",
"@ReplaceMe[123]@" => "Date"
}
generator_replacements.each{
|generator, replacement|
string = string.gsub!(generator.to_s, replacement.to_s)
puts string
}
end

replace_string

výstupy:

  1. TimeDateHello
  2. TimeDateHello

Nechápem prečo gsub! nahradil všetky hash kľúče naraz, a nie pri každej iterácii. Keď skúsim použiť gsub, nahrádza s každou iteráciou:

  1. Time@ReplaceMe[123]@Hello
  2. TimeDateHello

Môže niekto vysvetliť, prečo sa to stalo?

odpovede:

1 pre odpoveď č. 1

V tomto ohľade nie je rozdiel. The each slučka sa vykonáva prvok po prvku a ani jeden gsub ani gsub! môže predvídať budúcnosť.

Tento kód:

replacements = { "foo" => "hello", "bar" => "world" }
string = "foo bar!"
replacements.each do |placeholder, value|
string = string.gsub(placeholder, value)
end
string #=> "hello world!"

je ekvivalentom:

string = "foo bar!"
string = string.gsub("foo", "hello") #=> "hello bar!"
string = string.gsub("bar", "world") #=> "hello world!"
string #=> "hello world!"

s gsub! môžete napísať:

string = "foo bar!"
string.gsub!("foo", "hello") #=> "hello bar!"
string.gsub!("bar", "world") #=> "hello world!"
string #=> "hello world!"

Hlavným rozdielom je, že gsub! zmení prijímač na mieste, zatiaľ čo gsub vráti nový reťazec (a preto je potrebné ho priradiť späť k string).

Ak chcete vykonať viac náhrad naraz, môžete odovzdať hash znaku gsub:

string = "foo bar!"
string.gsub(/foo|bar/, { "foo" => "hello", "bar" => "world" })
#=> "hello world!"

Regulárny výraz je možné vygenerovať aj programovo:

replacements = { "foo" => "hello", "bar" => "world" }
string = "foo bar!"
string.gsub(Regexp.union(replacements.keys), replacements)
#=> "hello world!"

0 pre odpoveď č. 2

Upravil som váš kód tak, aby fungoval, ako je uvedené nižšie:

def replace_string(generated_string = "@ReplaceMe[xyz]@@ReplaceMe[123]@Hello")
generator_replacements = {
"@ReplaceMe[xyz]@" => "Time",
"@ReplaceMe[123]@" => "Date"
}
generator_replacements.each do |generator, replacement|
string = generated_string.gsub(generator.to_s, replacement.to_s)
puts string
end
end

S týmto kódom pomocou gsub Dostávam:

Time@ReplaceMe[123]@Hello
@ReplaceMe[xyz]@DateHello

a s gsub! Dostávam:

Time@ReplaceMe[123]@Hello
TimeDateHello

Dôvodom je to gsub! upraví existujúci reťazec, kde ako gsub nezmení existujúci reťazec. Pomáha to odpovedať na vašu otázku?