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