Search code examples
rubysyntaxscopesplat

What does *:: (asterisk double colon) do in Ruby?


I was poking through the Rails code today and stumbled upon this snippet:

new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))

What does the asterisk-double-colon (or splat-double-colon if you will) in *::Date do?

Presumably it has something to do with the scope of a particularly-namespaced Date class... but it's necessary enough for the author to include it rather than just use the standard Date class.


Solution

  • I was reading the code wrong; it's not a "*::" operator at all.

    Here's what's happening:

    • Find the Date class in the global scope (::Date)
    • call _parse() to get a hash of values
    • call values_at to turn the hash into an array
    • use the asterisk operator in its typical function of turning an array into multiple arguments for a method call
    • call new_date(), passing the array elements in for its year, mon, and mday arguments.

    The lack of space between the * and :: operators made it confusing. :-\