Call the previous, aliased version of a method from a redefined method.
| class String |
| alias_method :old_reverse, :reverse |
| |
| def reverse |
| "x#{old_reverse}x" |
| end |
| end |
| |
| "abc".reverse # => "xcbax" |
For more information, see page .
Remove methods from an object to turn them into Ghost Methods ().
| class C |
| def method_missing(name, *args) |
| "a Ghost Method" |
| end |
| end |
| |
| obj = C.new |
| obj.to_s # => "#<C:0x007fbb2a10d2f8>" |
| |
| class D < BasicObject |
| def method_missing(name, *args) |
| "a Ghost Method" |
| end |
| end |
| |
| blank_slate = D.new |
| blank_slate.to_s # => "a Ghost Method" |
For more information, see page .
Define class methods by mixing a module into a class’s singleton class (a special case of Object Extension ()).
| class C; end |
| |
| module M |
| def my_method |
| 'a class method' |
| end |
| end |
| |
| class << C |
| include M |
| end |
| |
| C.my_method # => "a class method" |
For more information, see page .
Store class-level state in an instance variable of the Class object.
| class C |
| @my_class_instance_variable = "some value" |
| |
| def self.class_attribute |
| @my_class_instance_variable |
| end |
| end |
| |
| C.class_attribute # => "some value" |
For more information, see page .
Use a class method in a class definition.
| class C; end |
| |
| class << C |
| def my_macro(arg) |
| "my_macro(#{arg}) called" |
| end |
| end |
| |
| class C |
| my_macro :x # => "my_macro(x) called" |
| end |
For more information, see page .
Use an object as an environment in which to evaluate a block.
| class CleanRoom |
| def a_useful_method(x); x * 2; end |
| end |
| |
| CleanRoom.new.instance_eval { a_useful_method(3) } # => 6 |
For more information, see page .
Process Strings of Code () from an external source.
| File.readlines("a_file_containing_lines_of_ruby.txt").each do |line| |
| puts "#{line.chomp} ==> #{eval(line)}" |
| end |
| |
| # >> 1 + 1 ==> 2 |
| # >> 3 * 2 ==> 6 |
| # >> Math.log10(100) ==> 2.0 |
For more information, see page .
Execute a block to access information in an object’s context.
| class C |
| def initialize |
| @x = "a private instance variable" |
| end |
| end |
| |
| obj = C.new |
| obj.instance_eval { @x } # => "a private instance variable" |
For more information, see page .
Store a piece of code and its context in a proc or lambda for evaluation later.
| class C |
| def store(&block) |
| @my_code_capsule = block |
| end |
| |
| def execute |
| @my_code_capsule.call |
| end |
| end |
| |
| obj = C.new |
| obj.store { $X = 1 } |
| $X = 0 |
| |
| obj.execute |
| $X # => 1 |
For more information, see page .
Decide which method to call at runtime.
| method_to_call = :reverse |
| obj = "abc" |
| |
| obj.send(method_to_call) # => "cba" |
For more information, see page .
Decide how to define a method at runtime.
| class C |
| end |
| |
| C.class_eval do |
| define_method :my_method do |
| "a dynamic method" |
| end |
| end |
| |
| obj = C.new |
| obj.my_method # => "a dynamic method" |
For more information, see page .
Dynamically forward method calls to another object.
| class MyDynamicProxy |
| def initialize(target) |
| @target = target |
| end |
| |
| def method_missing(name, *args, &block) |
| "result: #{@target.send(name, *args, &block)}" |
| end |
| end |
| |
| obj = MyDynamicProxy.new("a string") |
| obj.reverse # => "result: gnirts a" |
For more information, see page .
Use a closure to share variables between two scopes.
| class C |
| def an_attribute |
| @attr |
| end |
| end |
| |
| obj = C.new |
| a_variable = 100 |
| |
| |
| |
| # flat scope: |
| obj.instance_eval do |
| @attr = a_variable |
| end |
| |
| obj.an_attribute # => 100 |
For more information, see page .
Respond to a message that doesn’t have an associated method.
| class C |
| def method_missing(name, *args) |
| name.to_s.reverse |
| end |
| end |
| |
| obj = C.new |
| obj.my_ghost_method # => "dohtem_tsohg_ym" |
For more information, see page .
Override a method to intercept object model events.
| $INHERITORS = [] |
| class C |
| def self.inherited(subclass) |
| $INHERITORS << subclass |
| end |
| end |
| |
| class D < C |
| end |
| |
| class E < C |
| end |
| |
| class F < E |
| end |
| |
| $INHERITORS # => [D, E, F] |
For more information, see page .
Define a method in module Kernel to make the method available to all objects.
| module Kernel |
| def a_method |
| "a kernel method" |
| end |
| end |
| |
| a_method # => "a kernel method" |
For more information, see page .
Wait until the first access to initialize an instance variable.
| class C |
| def attribute |
| @attribute = @attribute || "some value" |
| end |
| end |
| |
| obj = C.new |
| obj.attribute # => "some value" |
For more information, see page .
Disguise a method as another language construct.
| def BaseClass(name) |
| name == "string" ? String : Object |
| end |
| |
| class C < BaseClass "string" # a method that looks like a class |
| attr_accessor :an_attribute # a method that looks like a keyword |
| end |
| |
| obj = C.new |
| obj.an_attribute = 1 # a method that looks like an attribute |
For more information, see page .
Change the features of an existing class.
| "abc".reverse # => "cba" |
| |
| class String |
| def reverse |
| "override" |
| end |
| end |
| |
| "abc".reverse # => "override" |
For more information, see page .
Define constants within a module to avoid name clashes.
| module MyNamespace |
| class Array |
| def to_s |
| "my class" |
| end |
| end |
| end |
| |
| Array.new # => [] |
| MyNamespace::Array.new # => my class |
For more information, see page .
Override a reference to nil with an “or.”
| x = nil |
| y = x || "a value" # => "a value" |
For more information, see page .
Define Singleton Methods by mixing a module into an object’s singleton class.
| obj = Object.new |
| |
| module M |
| def my_method |
| 'a singleton method' |
| end |
| end |
| |
| class << obj |
| include M |
| end |
| |
| obj.my_method # => "a singleton method" |
For more information, see page .
Modify an existing class.
| class String |
| def my_string_method |
| "my method" |
| end |
| end |
| |
| "abc".my_string_method # => "my method" |
For more information, see page .
Call a method from its prepended override.
| module M |
| def reverse |
| "x#{super}x" |
| end |
| end |
| |
| String.class_eval do |
| prepend M |
| end |
| |
| "abc".reverse # => "xcbax" |
For more information, see page .
Patch a class until the end of the file, or until the end of the including module.
| module MyRefinement |
| refine String do |
| def reverse |
| "my reverse" |
| end |
| end |
| end |
| |
| "abc".reverse # => "cba" |
| using MyRefinement |
| "abc".reverse # => "my reverse" |
For more information, see page .
Call an unrefined method from its refinement.
| module StringRefinement |
| refine String do |
| def reverse |
| "x#{super}x" |
| end |
| end |
| end |
| |
| using StringRefinement |
| "abc".reverse # => "xcbax" |
For more information, see page .
Execute untrusted code in a safe environment.
| def sandbox(&code) |
| proc { |
| $SAFE = 2 |
| yield |
| }.call |
| end |
| begin |
| sandbox { File.delete 'a_file' } |
| rescue Exception => ex |
| ex # => #<SecurityError: Insecure operation at level 2> |
| end |
For more information, see page .
Isolate a scope with the class, module, or def keyword.
| a = 1 |
| defined? a # => "local-variable" |
| |
| module MyModule |
| b = 1 |
| defined? a # => nil |
| defined? b # => "local-variable" |
| end |
| |
| defined? a # => "local-variable" |
| defined? b # => nil |
For more information, see page .
Pass self to the current block.
| class Person |
| attr_accessor :name, :surname |
| |
| def initialize |
| yield self |
| end |
| end |
| |
| joe = Person.new do |p| |
| p.name = 'Joe' |
| p.surname = 'Smith' |
| end |
For more information, see page .
Share variables among multiple contexts in the same Flat Scope ().
| lambda { |
| shared = 10 |
| self.class.class_eval do |
| define_method :counter do |
| shared |
| end |
| define_method :down do |
| shared -= 1 |
| end |
| end |
| }.call |
| |
| counter # => 10 |
| 3.times { down } |
| counter # => 7 |
For more information, see page .
Define a method on a single object.
| obj = "abc" |
| |
| class << obj |
| def my_singleton_method |
| "x" |
| end |
| end |
| |
| obj.my_singleton_method # => "x" |
For more information, see page .
Evaluate a string of Ruby code.
| my_string_of_code = "1 + 1" |
| eval(my_string_of_code) # => 2 |
For more information, see page .
Convert a symbol to a block that calls a single method.
| [1, 2, 3, 4].map(&:even?) # => [false, true, false, true] |
For more information, see page .