Git
Closure
Es una función evaluada en un entorno conteniendo una o mas variables de otro entorno (llamadas variables libres) esta función puede acceder a ellas
def metodo_con_bloque(&bloque) bloque.call end def metodo_con_bloque_sin_arg yield end def metodo_con_bloque_sin_arg_tuned yield if block_given? end def mostrar_el_resultado if block_given? value = yield puts "El bloque retorno: #{value}" end end
class Document attr_accessor :content def initialize(content = nil) @content = '' yield(self) if block_given? end end
Funcional
Proc (funciones anónimas) y lambdas
Diferencias:
1. The first difference is that, unlike Procs, lambdas check the number of arguments passed.
Proc.new{|a, b, c| puts "Give me a #{a} and a #{b} and a #{c.class}"} lambda{|a, b, c| puts "Give me a #{a} and a #{b} and a #{c.class}"}
2. Las lambda tienen retornos diminutivos. El retorno de Proc detiene el método donde se encuentra y devuelve el valor provisto.
def proc_return Proc.new { return "Proc.new"}.call return "proc_return method finished" end def lambda_return lambda { return "lambda" }.call return "lambda_return method finished" end
Metaprogramación
Coding techniques that allow you to get the results you need with less code.
Hooks
Herencia
class SimpleBaseClass def self.inherited( new_subclass ) puts "Hey #{new_subclass} is now a subclass of #{self}!" end end
Ejemplo: Importación de un documento. Subclases (XML, JSON, YAML, etc). Cuando heredo, en la clase padre guardo un array con cada tipo
Modulos
module WritingQuality def self.included(klass) puts "Hey, I've been included in #{klass}" end end module UsefulMethods module ClassMethods def a_class_method puts "A class method!!" end end def self.included(host_class) host_class.extend(ClassMethods) end def an_instance_method puts "an instance method!" end end class Host include UsefulMethods end