История изменений
Исправление theNamelessOne, (текущая версия) :
У тебя код на Ruby и на Javascript не эквивалентный. gsub!
— деструктивный метод, который меняет оригинальную строку и возвращает nil
, если замена не произведена, replace
же (не деструктивный метод, т.к. возращает новую строку) в таком случае вернёт оригинальную строку; такого поведения в Ruby можно добиться с помощью метода gsub
. Плюс у тебя в Javascript выполняется две замены в отличие от одной в Ruby.
def dummy_replace(code, replacement, continuations: ['.', '['])
var = code[/^\s*([^ ]+) /, 1]
pattern = /\b#{Regexp.escape(var)}(#{Regexp.union(continuations)})/
code.gsub(pattern, "#{replacement}\\1")
end
puts
puts 'Works out of the box!'
puts dummy_replace('i => Label1.text = i.ToString()', 'auto_var')
puts dummy_replace('i => Label1.text = i[0].ToString()', 'auto_var')
puts
puts "Doesn't work :'("
puts dummy_replace('i => Label1.text = i(2, 3)', 'auto_var')
puts
puts 'But this one does!'
puts dummy_replace('i => Label1.text = i(2, 3)', 'auto_var', continuations: '(')
Результат:
Works out of the box!
i => Label1.text = auto_var.ToString()
i => Label1.text = auto_var[0].ToString()
Doesn't work :'(
i => Label1.text = i(2, 3)
But this one does!
i => Label1.text = auto_var(2, 3)
Исходная версия theNamelessOne, :
У тебя код на Ruby и на Javascript не эквивалентный. gsub!
— деструктивный метод, который меняет оригинальную строку и возвращает nil
, если замена не произведена, replace
же (не деструктивный метод, т.к. возращает новую строку) в таком случае вернёт оригинальную строку; такого поведения в Ruby можно добиться с помощью метода gsub
. Плюс у тебя в Javascript выполняется две замены в отличие от одной в Ruby.
def dummy_replace(code, replacement, continuations: ['.', '['])
var = code[/^\s*([^ ]+) /, 1]
pattern = /\b#{Regexp.escape(var)}(#{Regexp.union(Array(continuations))})/
code.gsub(pattern, "#{replacement}\\1")
end
puts
puts 'Works out of the box!'
puts dummy_replace('i => Label1.text = i.ToString()', 'auto_var')
puts dummy_replace('i => Label1.text = i[0].ToString()', 'auto_var')
puts
puts "Doesn't work :'("
puts dummy_replace('i => Label1.text = i(2, 3)', 'auto_var')
puts
puts 'But this one does!'
puts dummy_replace('i => Label1.text = i(2, 3)', 'auto_var', continuations: '(')
Результат:
Works out of the box!
i => Label1.text = auto_var.ToString()
i => Label1.text = auto_var[0].ToString()
Doesn't work :'(
i => Label1.text = i(2, 3)
But this one does!
i => Label1.text = auto_var(2, 3)