oop/nested_class_names_no_parens.rb

tests/_examples/oop/nested_class_names_no_parens.rb in the metorex repository.

# A class nested in a class can inherit from the class holding it.
class Parser
  def name = "parser"

  class Lexer < ::Parser
  end

  class Scanner < Parser
  end
end
p Parser::Lexer.superclass
p Parser::Scanner.superclass
p Parser::Lexer.new.name

# Each class Struct.new answers is its own class.
Token = Struct.new(:type, :text)
Event = Struct.new(:name, :args)
token = Token.new(:ident, "x")
p token.is_a?(Token)
p token.is_a?(Event)
p Event === token
p Class.new(Struct) === token

# A method calls itself by name alone.
class Countdown
  def initialize(from)
    @from = from
  end

  def steps
    return [] if @from.zero?

    current = @from
    @from -= 1
    [current] + steps
  end
end
p Countdown.new(4).steps

Output:

Parser
Parser
"parser"
true
false
false
false
[4, 3, 2, 1]