Skip to content

Instantly share code, notes, and snippets.

@francisco-rojas
Last active January 12, 2019 04:23
Show Gist options
  • Save francisco-rojas/db0fb04ed6aa509acc18 to your computer and use it in GitHub Desktop.
Save francisco-rojas/db0fb04ed6aa509acc18 to your computer and use it in GitHub Desktop.
Ruby Splat Operator
# https://gist.github.com/francisco-rojas/db0fb04ed6aa509acc18
# https://dev.firmafon.dk/blog/drat-ruby-has-a-double-splat/
# http://blog.simplificator.com/2015/03/20/ruby-and-the-double-splat-operator/
# http://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/
# ------------------------------------------------------Method Definition-----------------------------------------------------
puts "\n---Method Definition---\n"
def say(what, *people)
people.each { |person| puts "#{person}: #{what}" }
end
say "Hello!", "Alice", "Bob", "Carl"
puts
def greet_person(greeting, *people, opts)
people.each { |person| puts "#{person}: #{greeting} #{opts[person]}" }
end
greet_person "Hello!", "Alice", "Bob", "Carl", 'Alice' => 'Guys', 'Bob' => 'Alice', 'Carl' => 'Alice'
puts
def print_pair(a, b, *)
puts "#{a} and #{b}"
end
print_pair 1,2,3,:cake,7
# ------------------------------------------------------Swapping Variables----------------------------------------------------
puts "\n---Swapping Variables---\n"
a, b = 1, 2
puts "a=#{a} b=#{b}"
a, b = b, a
puts "a=#{a} b=#{b}"
# ------------------------------------------------------Array Destructuring---------------------------------------------------
puts "\n---Array Destructuring---\n"
a, b, c = *[1, 2, 3]
puts "a=#{a}, b=#{b}, c=#{c}"
puts
first, *rest = [1,2,3,4]
puts "first=#{first} rest=#{rest}"
puts
*rest, last = [1,2,3,4]
puts "rest=#{rest}, last=#{last}"
puts
first, *rest, last = [1,2,3,4]
puts "first=#{first}, rest=#{rest}, last=#{last}"
c = [*[1,2,3], 4, 5]
puts "c=#{c}"
# ------------------------------------------------------Array Coercion--------------------------------------------------------
puts "\n---Array Coercion---\n"
a = 1, 2, 3
*b = 1, 2, 3
puts "a=#{a}, b=#{b}"
a = *"Hello"
puts "a=#{a}"
# "Hello".to_a #=> NoMethodError: undefined method `to_a' for "Hello":String
b = *(1..3)
puts "b=#{b}"
# ------------------------------------------------------Double Splat----------------------------------------------------------
puts "\n---Double Splat---\n"
options = { a: 'b' }
puts("Expanding a hash:", { c: 'd', **options })
puts
def double_splat(**hash)
puts "double_splat: #{hash}"
end
double_splat
# double_splat(nil) # wrong number of args
double_splat(a: 1, b: 2)
puts
def default_param(hash = {})
puts "default_param: #{hash}"
end
default_param
default_param(nil)
default_param(a: 1, b: 2)
puts
def extracted_options(*names, **options)
puts "extracted_options: #{names}, #{options}"
end
extracted_options
extracted_options('pascal', 'lukas', color: '#123456', offset: 3, other_option: :foo)
puts
def with_defaults(name = nil, **options)
puts "with_defaults: name=#{name}, options=#{options}"
end
with_defaults
with_defaults('Fran', age: 27)
with_defaults(age: 27) # Moves the hash-like argument over to the double splat variable
puts
def with_defaults2(name = nil, options = {})
puts "with_defaults2: name=#{name}, options=#{options}"
end
with_defaults2
with_defaults2('Fran', age: 27)
with_defaults2(age: 27) # hash-like argument gets assigned to the first arg
puts
def without_defaults(name, **options)
puts "without_defaults: #{name}, #{options}"
end
without_defaults(nil)
without_defaults(color: :red, size: :big)
without_defaults('string', color: :red)
# without_defaults('string', 1) # wrong number of args
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment