لماذا الأعداد الصحيحة في PowerShell مقارنة بالأرقام؟




comparison operators (3)

يخبرك الكود الخاص بي ما إذا كان رقم التخمين الخاص بك أعلى أو أقل من الرقم الذي تم إنشاؤه عشوائيًا ، ولكن يبدو أنه يقارن فقط الأرقام الأولى من الرقم عندما يكون واحد منهم أقل من 10.

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum

$isQuitting = $false
Do{
    [int]$Input = Read-Host "Take a guess!"

    If($Input -lt $GeneratedNum){Write-Output "Too Low"}
    If($Input -gt $GeneratedNum){Write-Output "Too High"}
    If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}

} Until($isQuitting -eq $true)

على سبيل المثال ، عندما يكون $GeneratedNum = 56 و $Input = 7 ، فإنها تُرجع "Too High"


باستخدام switch :

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum

:lop Do{
    switch ((Read-Host 'Take a new guess!') -as [int])
    {
        {$_ -eq $null}{continue}
        {$_ -lt $GeneratedNum}{'Too Low';continue}
        {$_ -gt $GeneratedNum}{'Too High';continue}
        {$true}{'Good Job!';break lop}
    }

} while($true)

تكمن المشكلة في حقيقة أن Read-Host بإرجاع سلسلة ، لذلك مع محاولة $Input الخاصة بك هي محاولة ArrayListEnumeratorSimple :

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum

$isQuitting = $false
Do{
    $Input = (Read-Host "Take a guess!") -as [int]

    If($Input -lt $GeneratedNum){Write-Output "Too Low"}
    If($Input -gt $GeneratedNum){Write-Output "Too High"}
    If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true}

} Until($isQuitting -eq $true)

يجب أيضًا استخدام try{}catch{} للوقوف على الحالة التي يكون فيها الإدخال غير int.

الشيء الذي يجب أن تفهمه هو أنه عند استخدام عوامل مقارنة PowerShell ، يتم استخدام نوع الجزء الأيسر ، وبالتالي يتم صب الجزء الصلب في النوع الأيسر. مع العلم أنه كان بإمكانك كتابة ما يلي ، حيث وضعت للتو $GeneratedNum وهو عدد صحيح على يسار المقارنات:

[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-host $GeneratedNum

$isQuitting = $false
Do{
    $Input = (Read-Host "Take a guess!")

    If($GeneratedNum -gt $Input){Write-Output "Too Low"}
    If($GeneratedNum -lt $Input){Write-Output "Too High"}
    If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true}

} Until($isQuitting -eq $true)

هذا لأنك تقارن سلسلة بأعداد صحيحة. يهم النظام.

"56" -lt 7

هو في الواقع نفس:

"56" -lt "7"

بدلا من ذلك:

56 -lt "7"

سوف أعطيك النتيجة الصحيحة. يحاول PowerShell فرض وسيطة الجانب الأيمن على نوع الجانب الأيسر.

يمكنك تجربة طاقم واضح:

[int]$Input -lt $GeneratedNum




operators