-
-
Save najamelan/17d621ded6610b01714206d962a5ea3c to your computer and use it in GitHub Desktop.
Ruby Splat Operator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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