It's to avoid ambiguity. Consider the following:
def foo(a, b = 1) # foo takes an optional second argument
end
[foo 1, 2]
This could be interpreted as [(foo 1), 2]
or as [(foo 1, 2)]
.
There are two references in the Calling Methods docs (although not directly related to the array literal):
Note that the parenthesis are optional ... Except when there is difference between using and omitting parentheses
In many cases parenthesis are not necessary when sending a message ... However, parenthesis are necessary to avoid ambiguity.