Intro to Splat (*) operator in Ruby


I usually use following to create a bunch of array elements in Ruby.

  arr = (10..50).to_a     # converting a range to an array.

Today I noticed following which performs same operation:

  arr = [*10..50]        # splat operator

My reaction was “Awesome!!!!” :astonished:.

So, then, one day I took some time to investigate more on this (*) operator.

Following are my findings.

  • Generally used in “Method definition with variable no. of parameter”.
  def demo(*numbers)
    numbers.each { |num| puts "#{num}" }
  end
  demo(1,2,3,4)

  #output
  1
  2
  3
  4
  • Converting an array into list of arguments in method calling.

In this case, the splat converts the array into method arguments.

  def demo(arg1, arg2, arg3)
    puts "arg1 is #{arg1}, arg2 is #{arg2} and arg3 is #{arg3}"
  end
  arr = [10, 20.45, "hello"]
  demo *arr

  #output
  arg1 is 10, arg2 is 20.45 and arg3 is hello
  • Use in case statement :
  male = ["ram", "rahul", "karan"]
  female = ["kareena", "aish", "juhi", "katerina"]
  person = "aish"

  case person
  when *male
    puts "Male"
  when *female
    puts "Female"
  end

  #output
  Female
  • Interesting Array data retrieval:
  arr = ["one", "two", "three", "four"]
  first, *others = arr         #first = "one", others = ["two", "three", "four"]
  *others, last = arr          #others = ["one", "two", "three"] , last = "four"
  first, *center, last = arr   #first = "one", center = ["two", "three"], last = "four"
  • Datatype Coercion : Splat operator can be used to convert interesting datatype coercion.

a) String into Array : Splat can also be used to coerce string values into array.

  arr = *"Hello"       # ["Hello"]
  "Hello".to_a         # NoMethodError: undefined method 'to_a' for "Hello":String

Note : This will only create array of size 1.

b) Range into Array :

  arr = *(10..20)     # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Above is similar behavior as arr = (10..20).to_a

c) Hash into an Array:

  arr = *{ :a => "111", :b => "222" }    # [[:a, "111"], [:b, "222"]]

Note : Use Hash[*arr.flatten] to reverse it.

Cool BRG

Thank you for reading the post. Click to Go Back.

Share