builtins/hash_literal_rules_no_parens.rb

tests/_examples/builtins/hash_literal_rules_no_parens.rb in the metorex repository.

key = +"region"
settings = {key => "us-east"}
key.upcase!
p settings.keys.first
p settings.keys.first.frozen?
p key
p settings.each.size

defaults = nil
p({timeout: 5, **defaults})

class Overrides
  def to_hash
    {retries: 2}
  end
end
p({timeout: 5, **Overrides.new})

bare = BasicObject.new
def bare.to_hash
  {verbose: true}
end
p({**bare, timeout: 5})

class BadOverrides
  def to_hash
    :none
  end
end
[-> { {**BadOverrides.new} }, -> { {**42} }].each do |attempt|
  begin
    attempt.call
  rescue TypeError => error
    puts error.message
  end
end

def Warning.warn message
  puts message[/key .* is duplicated/]
end
merged = eval "{a: 1, **{a: 2, b: 3}}"
p merged

record = ->(name, **options) { [name, options] }
p record.call :job, **nil

limit = 3
count = 2
p(limit!=count)

["{:a ==> 1}", "{:a!=> 1}", "{\"\\xC3\": 1}", "{name!:}"].each do |source|
  begin
    eval source
  rescue SyntaxError
    puts "syntax error: #{source}"
  end
end

Output:

"region"
true
"REGION"
1
{timeout: 5}
{timeout: 5, retries: 2}
{verbose: true, timeout: 5}
can't convert BadOverrides to Hash (BadOverrides#to_hash gives Symbol)
no implicit conversion of Integer into Hash
key :a is duplicated
{a: 2, b: 3}
[:job, {}]
true
syntax error: {:a ==> 1}
syntax error: {:a!=> 1}
syntax error: {"\xC3": 1}
syntax error: {name!:}