Возвращает метод класса PowerShell 5.0 Не все пути кода возвращают значение в методе

В качестве эксперимента с классами PowerShell 5.0 я попытался перевести код JavaScript для задачи «Стабильный брак» в Rosetta Code. Это казалось очень простым, но второй метод (Rank) возвращает ошибку: не все пути кода возвращают значение внутри метода.

class Person
{
    # --------------------------------------------------------------- Properties
    hidden [int]$CandidateIndex  = 0
    [string]$Name
    [person]$Fiance = $null
    [person[]]$Candidates = @()

    # ------------------------------------------------------------- Constructors
    Person ([string]$Name)
    {
        $this.Name = $Name       
    }

    # ------------------------------------------------------------------ Methods
    static [void] AddCandidates ([person[]]$Candidates)
    {
        [Person]::Candidates = $Candidates
    }

    [int] Rank ([person]$Person)
    {
        for ($i = 0; $i -lt $this.Candidates.Count; $i++)
        { 
            if ($this.Candidates[$i] -eq $Person)
            {
                return $i
            }

            return $this.Candidates.Count + 1
        }
    }

    [bool] Prefers ([person]$Person)
    {
        return $this.Rank($Person) -lt $this.Rank($this.Fiance)
    }

    [person] NextCandidate ()
    {
        if ($this.CandidateIndex -ge $this.Candidates.Count)
        {
            return $null
        }

        return $this.Candidates[$this.CandidateIndex++]
    }

    [int] EngageTo ([person]$Person)
    {
        if ($Person.Fiance)
        {
            $Person.Fiance.Fiance = $null
        }

        return $this.Fiance = $Person
    }

    [void] SwapWith ([person]$Person)
    {
        Write-Host ("{0} and {1} swap partners" -f $this.Name, $Person.Name)
        $thisFiance = $this.Fiance
        $personFiance = $Person.Fiance
        $this.EngageTo($personFiance)
        $Person.EngageTo($thisFiance)
    }
}

person Vince Ypma    schedule 04.01.2017    source источник


Ответы (1)


Ошибка в том, что если $this.Candidates.Count равно 0, возврат не будет выполнен.

Должен ли второй возврат быть за пределами вашего цикла for?

Текущий способ, если он не соответствует первому кандидату, вернет $this.Candidates.Count + 1.

[int] Rank ([person]$Person)
{
    for ($i = 0; $i -lt $this.Candidates.Count; $i++)
    { 
        if ($this.Candidates[$i] -eq $Person)
        {
            return $i
        }
    }
    return $this.Candidates.Count + 1
}
person Jeff Block    schedule 04.01.2017
comment
Спасибо за очень быстрый ответ и за то, что напомнили мне не делать простой прямой перевод. Я признал свою ошибку и не буду повторять ее. - person Vince Ypma; 04.01.2017