Is the RETURN statement necessary in a Function?

Welcome Forums General PowerShell Q&A Is the RETURN statement necessary in a Function?

This topic contains 2 replies, has 3 voices, and was last updated by

 
Participant
3 months, 1 week ago.

  • Author
    Posts
  • #106006

    Participant
    Points: 109
    Rank: Participant

    Just about every blog or post I've run into says the 'Return' statement in PS is really not needed, that all it does is to stop execution and pass control back to the calling routine. More relevant to this is that "everything that is outputted in the called Function is returned to the calling routine: as an array." Q1 – WHERE is the array?
    With these impressions, rightly or wrongly, I cannot see how Return is "not needed":

    function Get-Sum([int]$value)
    {
      $result = $value + $value
      return $result
    }
    $value = Read-Host 'Enter a value'
    $result = Get-Sum $value
    Write-Output "$value + $value = $result"
    

    In the above example, if I removed the 'return $result' statement in the function,
    I would get from the Write-Output statement the ff output:
    11 + 11 =
    while with the 'return $result' I would get:
    11 + 11 = 121
    Q2 – I must be missing something about how RETURN works in a PS Function, or my example has a fundamental flaw, or ??
    Would appreciate any tips or advice.

  • #106009

    Keymaster
    Points: 1,625
    Helping HandTeam Member
    Rank: Community Hero

    Ah, the Return keyword.

    No, it isn't necessary. Outside of a v5+ class, the Return keyword basically just emits to Write-Output and exits. It's "syntax sugar," and it doesn't behave the way Return does in any other language. It's generally to be avoided. Snover regrets it. Its existence encourages programming patterns that, in PowerShell, are incorrect.

    Just use Write-Output.

  • #106010

    Participant
    Points: 165
    Helping Hand
    Rank: Participant

    Or, even better (for performance-oriented functions) omit it entirely and drop to output.

    To powershell, both of the following are equivalent:

    #1
    Write-Output $Value
    #2
    $Value

    Write-Output introduces some additional overhead that is already handled by powershell's output stream anyway, so there's rarely a need to specify Write-Output at all.

    It's worth noting that return does follow some different patterns to Write-Output. For example, the return statement in the middle of a function, does exit the function as well as output what is requested. But it also sends along anything previously output in the function:

    function Write-Data {
      "Write 1" # Gets sent to output, no cmdlet required
    }
    
    PS> Write-Data
    Write 1
    function Write-Data {
      "Write 1"
      return "Write 2"
      Write-Output "Write 3"
    }
    
    PS> Write-Data
    Write 1
    Write 2

    As a result, return is a keyword (as Don mentions) best avoided in PowerShell. When writing PS classes, it is required — for functions and other ordinary script blocks, though, just avoid it. There are some cases where you do want to exit a function early. In those cases, to avoid being unclear, it is perhaps best to simply use the return statement alone, to indicate that that is its only purpose. If you pass it output, it may (for longer functions) appear that that is intended to be the only output, but it will not be.

    # Probably best avoided
    function Write-Data {
      Write-Output "Write 1"
      return "Write 2"
    }
    
    # probably OK, but use sparingly and only when absolutely necessary
    function Write-Data {
      "Write 1"
      "Write 2"
      return
    }

    That would be my personal preference. Yes, it does work in the first way, but for ease of maintainability I'd advise against it.

The topic ‘Is the RETURN statement necessary in a Function?’ is closed to new replies.