Вы можете сделать это следующим образом.Для упрощения я сделал аргумент метода строкой, а не целым числом, которое немедленно преобразуется в строку.
def test(num)
start_index = Hash.new(0)
num.each_char do |digit|
i = num.index(digit, start_index[digit])
puts "index for #{digit} is #{i}"
start_index[digit] = i + 1
end
end
test("232435")
index for 2 is 0
index for 3 is 1
index for 2 is 2
index for 4 is 3
index for 3 is 4
index for 5 is 5
Это работает, поскольку второй аргумент String # index указываетиндекс смещение , с которого начинается поиск.
Проблема в том, что этот метод бесполезен.Было бы проще написать следующее.
def test(num)
num.each_char.with_index { |digit,i| puts "index for #{digit} is #{i}" }
end
test("232435")
index for 2 is 0
index for 3 is 1
index for 2 is 2
index for 4 is 3
index for 3 is 4
index for 5 is 5
Можно добавить в метод аргументы, которые являются цифрами, индексы которых в первом аргументе должны быть определены.
def test(num, *args)
start_index = Hash.new(0)
args.each do |digit|
i = num.index(digit, start_index[digit])
puts "index for #{digit} is #{i}"
start_index[digit] = i + 1
end
end
test("232435", "3", "4", "2", "3", "2")
index for 3 is 1
index for 4 is 3
index for 2 is 0
index for 3 is 4
index for 2 is 2
Если яесли добавить к этому методу последнюю строку start_index
, возвращаемое значение будет
{"3"=>5, "4"=>4, "2"=>3}
, означающее, что поиск следующего "3"
должен начинаться со смещения 5
и т. д.
Естественно, потребуется дополнительный код для проверки того, что аргумент является цифрой и цифрой строки, что число аргументов, которые являются одной и той же цифрой, не превышает номера этой цифры в строке, ии так далее.