Project

General

Profile

Actions

Bug #20400

closed

Nested BEGIN{} execution order

Added by kddnewton (Kevin Newton) 30 days ago. Updated 29 days ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:117366]

Description

Right now there are specs for the order in which BEGIN{} should be executed, which is the order they appear in the file. For example:

BEGIN { print "1" }
print "4"
BEGIN { print "2" }
print "5"
BEGIN { print "3" }

should output "12345". However, I couldn't find any tests/specs on what happens when BEGIN{} is nested. The order appears to be somewhat confusing, so I wanted to clarify if it was intentional or a bug. For example:

BEGIN {
  print "1"
  BEGIN { print "2" }
}

prints "21", and:

BEGIN {
  print "1"
  BEGIN { print "2" }
  BEGIN { print "3" }
}

prints "231", and finally:

BEGIN {
  print "1"
  BEGIN {
    print "2"
    BEGIN { print "3" }
  }
  BEGIN { print "4" }
}

prints "3241". Is this intentional?

Updated by nobu (Nobuyoshi Nakada) 29 days ago

BEGIN blocks are:
a. executed in the order they appeared in the same nesting level.
b. executed in prior to outside the block.

BEGIN {
  print "1"
  BEGIN { print "2" }
}

"2" is first because it is in the inner BEGIN in the block for "1".

BEGIN {
  print "1"
  BEGIN { print "2" }
  BEGIN { print "3" }
}

Ditto, just there are multiple BEGIN blocks inside the same BEGIN.

BEGIN {
  print "1"
  BEGIN {
    print "2"
    BEGIN { print "3" }
  }
  BEGIN { print "4" }
}

"3" is executed prior to "2", because it is inside the block for "2", and the rest are same as the previous example.

Is this intentional?

This explanation makes sense?

Anyway, tests should be improved.

Updated by kddnewton (Kevin Newton) 29 days ago

  • Status changed from Open to Closed

Thank you for the clarification!

Actions

Also available in: Atom PDF

Like0
Like0Like0