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:
TimeDateHello
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:
Time@ReplaceMe[123]@Hello
TimeDateHello
Môže niekto vysvetliť, prečo sa to stalo?
odpovede:
1 pre odpoveď č. 1V 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?