Почему эта функция, использующая IndexOf, всегда возвращает 0? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть эта функция, которая проверяет количество вхождений шаблона в строку.Проблема в том, что он возвращает 0 независимо от ввода.Самое неприятное то, что это сработало 2 минуты назад, и я ничего не изменил.

let Counter (text : string) (pattern : string) =
    let mutable count = 0
    let mutable i = 0
    while ((i = text.IndexOf(pattern, i)) <> false) do
        i <- i + pattern.Length
        count <- count + 1
    count

1 Ответ

0 голосов
/ 04 декабря 2018

Основная проблема в том, что, похоже, вы пытаетесь присвоить новое значение для i внутри теста в цикле while, но оператор = проверяет равенство и не выполняет присваивание.Оператор присваивания <- имеет тип возврата unit (он не возвращает назначенное значение), поэтому исправление не может быть таким простым, как замена вызова на = вызовом на <-.

Самым простым решением, вероятно, является разбиение этого теста на отдельную внутреннюю функцию:

let counter (text : string) (pattern : string) =
    let mutable i = 0
    let moveNext() =
        i <- text.IndexOf(pattern, i)
        i
    let mutable count = 0
    while (moveNext() >= 0) do
        i <- i + pattern.Length
        count <- count + 1
    count

Однако обратите внимание, что это не идиоматический код F #.Вместо этого я бы написал так:

let counter (text : string) (pattern : string) =
    let rec countFrom (i:int) total =
        match text.IndexOf(pattern, i) with
        | j when j >= 0 -> countFrom (j+pattern.Length) (total+1)
        | _ -> total
    countFrom 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...