Ruby anatomy

From wikinotes
Revision as of 20:32, 13 November 2022 by Will (talk | contribs) (→‎Example)

Example

# project structure
myproject/
  lib/
    bar/
      baz.rb
    foo.rb
  Gemfile

lib/bar/baz.rb


module Bar
  class Baz
    def initialize(name:)
      @name = name
    end

    def say_hi
      puts("hi, #{@name}")
    end
  end
end


lib/foo.rb


require 'bar/baz'

if __FILE__ == $0
    baz = Bar::Baz.new(name: "alex")
    baz.say_hi()
end


Running 'foo.rb'

{{ NOTE | None of bundle, gem, chruby set the $LOAD_PATH. You'll have to do it yourself, using something like direnv or nix.

# '-I lib' sets the $LOAD_PATH so that the module can be found
ruby -I lib lib/foo.rb

basics

RUBY_VERSION()       # ruby version
RUBY_PATCHLEVEL()    # ruby patch revision
RUBY_DESCRIPTION()   # ruby version
3.times {puts "hi"}  # loop 3 times

reflection

myclass = MyClass.new()

myclass.methods                   # print all methods
myclass.methods - Object.methods  # print non-object methods
myclass.class                     # type

myclass.__FILE__                               # file class belongs to
instance.method(:method_name).source_location  # file method is defined in (nil means compiled)

MyModule.constants.select {|c| MyModule.const_get(c).is_a? Class}  # list all classes within a namespace

# files module is defined in
$LOADED_FEATURES.select { |file| File.read(file).include?('module Foo') rescue false }

builtins

Keywords/functions/types built in to ruby are defined within the Kernel module.

Find common types/functions like:

  • at_exit
  • open
  • Integer
  • ...

How to read API Docs

Ruby documentation can be difficult to browse.
In order to determine the scope you must browse:

  • class inheritance hierarchy
  • includes/extends
  • parent-hierarchy's includes/extends
  • includes/extends parent hierarchy


Try using ruby pry instead:

  • ls (show methods/attrs by namespace/class)
  • show-source -ld <method> (show docs/sourcecode)