I\'m learning the basics of Ruby (just starting out), and I came across the Hash.[] method. It was introduced with
a = [\"foo\", 1, \"bar\", 2]
=> [\"foo\", 1
Hash["a", "b", "c", "d"]
is equivalent to Hash.[]("a", "b", "c", "d")
. Almost everything in Ruby is a method call. 5 + 5
is equivalent to 5.+(5)
.
Given a = ["a", "b", "c", "d"]
Hash[*a]
is equivalent to Hash["a", "b", "c", "d"]
, which in turn is equivalent to Hash.[]("a", "b", "c", "d")
. Similarly, foo(*a)
is equivalent to foo("a", "b", "c", "d")
This is called the explode operator, and allows sending an array to a method and have each item in the array count as one argument to the method, instead of sending the array to the method as the first argument.
To specifically answer your update, there's nothing special that lets you put *a
inside the brackets. The brackets is just sugar for a normal method call. The only "special" thing here is that you can send *a
to any method.
There are a couple methods that ruby lets you call in a special way. These are the []
as you mentioned, the +
, -
, ==
and the like as someone else mentioned. Another important example are methods of the form something=(value)
which can be called with object.something = value
and allow you to create accessors.
Edit:
Fun fact 1: if you define a +
method you get +=
for free.
Fun fact 2: if you define a <=>
you get all comparison methods, courtesy of Comparable
The *<Array>
method tells ruby not to take the array as array, but to use the 'expanded' array.
Example:
def test(*argv)
p argv
end
a = [1,2,3]
test(a) #-> [[1, 2, 3]]
test(*a) #-> [1, 2, 3]
With test(a)
the array a is the one and only parameter.
With test(*a)
a is used as a list of parameters.
In your case
a = ["foo", 1, "bar", 2]
Hash[*a]
is similar to
Hash["foo", 1, "bar", 2]
Hash[*a]
would be
Hash[["foo", 1, "bar", 2]]
I think that Ruby's syntax is defined in parse.y for YARV Ruby.