LINUX.ORG.RU

История изменений

Исправление 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)