[HN Gopher] Better Know a Ruby Thing: Singleton Classes
       ___________________________________________________________________
        
       Better Know a Ruby Thing: Singleton Classes
        
       Author : mooreds
       Score  : 64 points
       Date   : 2025-01-27 20:18 UTC (4 days ago)
        
 (HTM) web link (noelrappin.com)
 (TXT) w3m dump (noelrappin.com)
        
       | xutopia wrote:
       | I love it when someone dives a bit deeper behind something pretty
       | common for most Ruby devs. It's actually a really elegant pattern
       | that is used and it's everywhere in Ruby.
        
       | empw wrote:
       | I haven't written any ruby for over a decade and a half, when
       | ruby 2.x was still on the horizon. But I do know the source of
       | "eigenclass". It was first jokingly used in an odd instructional
       | programming book / web comic / experimental art piece by "why the
       | lucky stiff" who was briefly prominent in ruby-land then erased
       | himself from the internet. It's funny that it has now become an
       | established term of art for Ruby people.
        
         | nixpulvis wrote:
         | I remember reading WPGTR in college. Really inspired me to play
         | around and learn the language. I've always kept my printed copy
         | in a safe place.
        
       | lcnPylGDnU4H9OF wrote:
       | > There are at least three ways to define a method in a Ruby
       | singleton class.
       | 
       | It's worth noting that two of such ways will, perhaps
       | unintuitively, ignore the `private` keyword.
       | private       def self.foo         # ...       end            def
       | x.foo         # ...       end
       | 
       | That will define a public method `:foo` on each of `self`'s and
       | `x`'s singleton classes. If you want the method to be private,
       | either 1) explicitly make the method private using
       | `Class#private` or `Class#private_class_method` or 2) use the
       | `class << self` (or `class << x`) syntax in order for the
       | `private` keyword to work as expected.
       | private_class_method def self.foo         # ...       end
       | def self.foo         # ...       end       private_class_method
       | :foo # `def` will return a symbol of the defined method name so
       | the above syntax is usually sufficient.            def x.foo
       | # ...       end       x.singleton_class.send :private, :foo #
       | Class#private is a private method(!) so must be called using
       | Object#send.            class << x       private         def foo
       | # ...         end       end
       | 
       | > The eternal question... Why is Ruby like this?
       | 
       | Joy! :) I'm pretty sure matz would agree.
        
       | corytheboyd wrote:
       | Went in expecting a basic how-to about the Singleton module, but
       | this is so much more, you clearly know your shit, and I love deep
       | dives like this!
        
       | Alifatisk wrote:
       | I have to admit, years back when I learned Ruby I found this
       | syntax to be very bizzare                 class User
       | class << self           def create_from_data           end
       | end       end
       | 
       | Specifically, this: class << self
       | 
       | But when reading about it, it made sense
        
       | Lammy wrote:
       | > What we've been calling "class methods" are actually instance
       | methods of the metaclass.
       | 
       | This also shows up if you ever want to use a Refinement on a
       | "class method". The thing you must `refine` is the
       | `singleton_class`.
       | 
       | Here's a live example from my UUID library where I refine
       | `Time::now` and one of my own utility class' methods to test the
       | time-went-backwards and network-card-changed cases for
       | incrementing the sequence value while generating time-based
       | UUIDs:
       | https://github.com/okeeblow/DistorteD/blob/3e9bbc744479afd3e...
        
       ___________________________________________________________________
       (page generated 2025-01-31 23:00 UTC)