Project

General

Profile

Misc #15514

Add documentation for implicit array decomposition

Added by sos4nt (Stefan Schüßler) 11 months ago. Updated 11 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
[ruby-core:90913]

Description

The documentation for Array Decomposition says: "[...] you can decompose an Array during assignment using parenthesis [sic]" and gives an example:

(a, b) = [1, 2]

p a: a, b: b # prints {:a=>1, :b=>2}

But – as we all know – it's also possible without parentheses, i.e.

a, b = [1, 2]

p a: a , b: b #=> {:a=>1, :b=>2}

This also applies to block arguments when yielding multiple values vs. yielding a single array:

def foo
  yield 1, 2
end

def bar
  yield [1, 2]
end

foo { |a, b| p a: a, b: b }
#=> {:a=>1, :b=>2}

bar { |a, b| p a: a, b: b }
#=> {:a=>1, :b=>2}

In both cases, parentheses are optional.

This implicit array decomposition could be quite surprising for newcomers. The documentation should cover it.

History

Updated by lugray (Lisa Ugray) 11 months ago

If that's covered (and I agree it should be) it's also worth showing a case where they are not optional:

def baz
  yield [1, 2], 3
end

baz { |a, b, c| p a: a, b: b, c: c }
#=> {:a=>[1, 2], :b=>3, :c=>nil}

baz { |(a, b), c| p a: a, b: b, c: c }
#=> {:a=>1, :b=>2, :c=>3}

Also available in: Atom PDF