Unary minus seems to have special precedence when a numeric literal is involved. Is this documented behavior?
The precedence tables I've seen (e.g. here) don't even mention the dot (method-call) operator.
Test on ruby 2.3.6:
puts "=== literal integer ==="
# `-` has higher precedence than `.`
p( -1.abs ) # => 1
p( -(1.abs) ) # => -1 (previous line should match this if `.` had higher precedence)
puts "=== literal float ==="
# again `-` has higher precedence than `.`
p( -1.2.abs ) # => 1.2
p( -(1.2.abs) ) # => -1.2 (previous line should match this if `.` had higher precedence)
puts "=== integer in a variable ==="
(1).tap do |i|
# `.` has higher precedence
p( -i.abs ) # -1
p( (-i).abs ) # 1 (previous line should match this if `-` had higher precedence)
end
puts "=== float in a variable ==="
(1.2).tap do |i|
# `.` has higher precedence
p( -i.abs ) # -1.2
p( (-i).abs ) # 1.2 (previous line should match this if `-` had higher precedence)
end
puts "=== literal string ==="
'a'.frozen? == false or raise "frozen_string_literal must be disabled"
# Note that unary minus on Strings returns a frozen copy if the string wasn't already frozen
# `.` has higher precedence (differs from numeric precedence)
p( (-'a'.succ).frozen? ) # true
p( ((-'a').succ).frozen? ) # false (previous line should match this if `-` had higher precedence)