|
|
|
|
|
by nitrogen
4398 days ago
|
|
a == b && a = 2 ? (a.object_id + b.object_id)/a : a + b It looks like you are missing an equals sign on a == 2. I just learned the object_id of 2 is 5 while doing this exercise, and I would like to continue learning more about how Ruby works. So if you have feedback, criticisms, or other ideas regarding this solution please feel free to share :) The object_id appears to be the tagged pointer that contains the value cast to an integer. Ruby stores all of its data types using a single underlying C data type (called VALUE in the Ruby source), using the bottom two bits to identify special values that aren't really pointers. This is why Fixnum can only hold 31 or 63 bits instead of 32 or 64 (including sign), for example: # Ruby irb on a 32-bit system
> (1<<30 - 1).class
=> Fixnum
> (1<<30).class
=> Bignum
See also:https://en.wikipedia.org/wiki/Tagged_pointer |
|
As a result here are some new ways I learned to get 5 from 2 + 2:
Note: This happens because calling `to_value` on the `Fiddle::Pointer` object returns a Float (2.0000000000000004) instead of Fixnum (which was a surprise to me).And here's another using `Object#tap`:
[1] These links were helpful for me. The last one is an MIT licensed book called, "Kestrels, Quirky Birds, and Hopeless Egocentricity."http://stackoverflow.com/questions/1872110/is-ruby-pass-by-r...
http://patshaughnessy.net/2014/1/9/how-big-is-a-bignum
http://stackoverflow.com/questions/2818602/in-ruby-why-does-...
http://combinators.info/#kestrels
Edit: line formatting