Using pry to inspect the method:
show-method 1.~
From: numeric.c (C Method):
Owner: Fixnum
Visibility: public
Number of lines: 5
static VALUE
fix_rev(VALUE num)
{
return ~num | FIXNUM_FLAG;
}
While this is impenetrable to me, it prompted me to look for a C unary ~
operator. One exists: it's the bitwise NOT operator, which flips the bits of a binary integer (~1010
=> 0101
). For some reason this translates to one less than the negation of a decimal integer in Ruby.
More importantly, since ruby is an object oriented language, the proper way to encode the behavior of ~0b1010
is to define a method (let's call it ~
) that performs bitwise negation on a binary integer object. To realize this, the ruby parser (this is all conjecture here) has to interpret ~obj
for any object as obj.~
, so you get a unary operator for all objects.
This is just a hunch, anyone with a more authoritative or elucidating answer, please enlighten me!
--EDIT--
As @7stud points out, the Regexp
class makes use of it as well, essentially matching the regex against $_
, the last string received by gets
in the current scope.
As @Daiku points out, the bitwise negation of Fixnum
s is also documented.
I think my parser explanation solves the bigger question of why ruby allows ~
as global unary operator that calls Object#~
.