Skip to content

Instantly share code, notes, and snippets.

@javierfernandes
Last active November 14, 2018 13:58
Show Gist options
  • Select an option

  • Save javierfernandes/ec8767ac19be5bdff1edd63d42e0afa7 to your computer and use it in GitHub Desktop.

Select an option

Save javierfernandes/ec8767ac19be5bdff1edd63d42e0afa7 to your computer and use it in GitHub Desktop.
Metaprogramacion - Ruby - IRB en clase - Log de lo que hicimos en clase 14/11/2018
>> >> require_relative("./src/age.rb")
=> true
>> >> atila = Guerrero.new
=> #<Guerrero:0x00007fc5d20a37d8 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>
>> >> atila.class
=> Guerrero
>> >> atila.class.name
=> "Guerrero"
>> >> atila.class
=> Guerrero
>> >> Peloton.methods(false)
=> [:cobarde, :descansador]
>> >> atila.methods(false)
=> []
>> >> atila.methods()
=> [:peloton, :lastimado, :cansado, :sufri_danio, :peloton=, :descansar, :descansar_atacante, :descansar_defensor, :potencial_defensivo=, :energia, :potencial_defensivo, :energia=, :potencial_ofensivo=, :descansado, :atacar, :descansado=, :potencial_ofensivo, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send, :to_s, :display, :nil?, :hash, :class, :singleton_class, :clone, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :==, :instance_exec, :!=, :__id__, :__send__]
>> >> atila.methods(false)
=> []
>> >> atila.class.instance_methods(false)
=> [:peloton, :lastimado, :cansado, :sufri_danio, :peloton=, :descansar, :descansar_atacante, :descansar_defensor]
>> >> atila.class.instance_methods() == atila.methods()
=> true
>> >> Guerrero.superclass
=> Object
>> >> Guerrero.ancestors
=> [Guerrero, Defensor, Atacante, Object, Kernel, BasicObject]
>> >> unaClase = Guerrero
=> Guerrero
>> >> unaClase.instance_methods()
=> [:peloton, :lastimado, :cansado, :sufri_danio, :peloton=, :descansar, :descansar_atacante, :descansar_defensor, :potencial_defensivo=, :energia, :potencial_defensivo, :energia=, :potencial_ofensivo=, :descansado, :atacar, :descansado=, :potencial_ofensivo, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send, :to_s, :display, :nil?, :hash, :class, :singleton_class, :clone, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :==, :instance_exec, :!=, :__id__, :__send__]
>> >> objeto = atila
=> #<Guerrero:0x00007fc5d20a37d8 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>
>> >> atila.methods()
=> [:peloton, :lastimado, :cansado, :sufri_danio, :peloton=, :descansar, :descansar_atacante, :descansar_defensor, :potencial_defensivo=, :energia, :potencial_defensivo, :energia=, :potencial_ofensivo=, :descansado, :atacar, :descansado=, :potencial_ofensivo, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send, :to_s, :display, :nil?, :hash, :class, :singleton_class, :clone, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :==, :instance_exec, :!=, :__id__, :__send__]
>> >> atila
=> #<Guerrero:0x00007fc5d20a37d8 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>
>> >> atila.descansar()
=> 110
>> >> mensaje = :descansar
=> :descansar
>> >> objeto.send(mensaje)
=> 120
>> >> atila
=> #<Guerrero:0x00007fc5d20a37d8 @potencial_ofensivo=20, @energia=120, @potencial_defensivo=10, @descansado=true>
>> >> objeto.send(mensaje)
=> 130
>> >> atila.send(:fruta)
Traceback (most recent call last):
1: from (irb):28
NoMethodError (undefined method `fruta' for #<Guerrero:0x00007fc5d20a37d8>)
>> >> atila.fruta
Traceback (most recent call last):
1: from (irb):29
NoMethodError (undefined method `fruta' for #<Guerrero:0x00007fc5d20a37d8>)
>> >> atila.methods().include? :descansar
=> true
>> >> atila.methods().include? :fruta
=> false
>> >> def construirInstancia(clase) clase.new end
=> :construirInstancia
>> >> construirInstancia(Guerrero)
=> #<Guerrero:0x00007fc5d0940a78 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>
>> >> (1..20).map { || construirInstancia(Guerrero)}
=> [#<Guerrero:0x00007fc5d09370e0 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d09370b8 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0937090 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0937068 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0937040 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0937018 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936ff0 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936fc8 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936fa0 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936f78 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936f50 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936f28 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936f00 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936ed8 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936eb0 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936e88 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936e60 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936e10 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936d70 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>, #<Guerrero:0x00007fc5d0936d20 @potencial_ofensivo=20, @energia=100, @potencial_defensivo=10>]
>> >> atila.method(:descansar)
=> #<Method: Guerrero#descansar>
>> >> descansar = atila.method(:descansar)
=> #<Method: Guerrero#descansar>
>> >> descansar.call()
=> 140
>> >> Guerrero.instance_method(:descansar)
=> #<UnboundMethod: Guerrero#descansar>
>> >> unboundDescansar = Guerrero.instance_method(:descansar)
=> #<UnboundMethod: Guerrero#descansar>
>> >> unboundDescansar.call()
Traceback (most recent call last):
1: from (irb):40
NoMethodError (undefined method `call' for #<UnboundMethod: Guerrero#descansar>)
>> >> unboundDescansar.methods(false)
=> []
>> >> unboundDescansar.methods()
=> [:arity, :==, :hash, :to_s, :inspect, :clone, :source_location, :parameters, :original_name, :name, :owner, :super_method, :eql?, :bind, :construirInstancias, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :respond_to?, :freeze, :object_id, :send, :display, :nil?, :class, :singleton_class, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :instance_exec, :!=, :__id__, :__send__]
>> >> unboundDescansar.owner
=> Guerrero
>> >> unboundDescansar.super_method
=> #<UnboundMethod: Defensor#descansar>
>> >> unboundDescansar.bind(atila)
=> #<Method: Guerrero#descansar>
>> >> unboundDescansar.bind(atila).call()
=> 150
>> >> unboundDescansar.bind(atila) == descansar
=> true
>> >> atila.descansado
=> true
>> >> atila.descansado = false
=> false
>> >> atila.descansado
=> false
>> >> atila.descansar
=> 160
>> >> atila.descansado
=> true
>> >> atila.descansado = false
=> false
>> >> Defensor.instance_method(:descansar).bind(atila).call()
=> 170
>> >> atila.energia
=> 170
>> >> atila.descansado
=> false
>> >> Defensor.instance_method(:descansar).bind(Object).call()
Traceback (most recent call last):
3: from (irb):59
2: from (irb):59:in `call'
1: from /Users/jfernandes/dev/data/repo/o3/tadp-clases/src/age.rb:32:in `descansar'
NoMethodError (undefined method `energia' for Object:Class)
>> >> atila.instance_variable_get(:energia)
Traceback (most recent call last):
2: from (irb):60
1: from (irb):60:in `instance_variable_get'
NameError (`energia' is not allowed as an instance variable name)
>> >> atila.instance_variable_get(:@energia)
=> 170
>> >> atila.instance_variable_set(:@energia, 90)
=> 90
>> >> atila.energia
=> 90
>> >> atila.class.instance_variable_set(:@energiaGlobal, 10000)
=> 10000
>> >> Guerrero.instance_variable_get(:@energiaGlobal)
=> 10000
>> >> Guerrero.define_method(:duplicarEnergia) { self.energia *= 2 }
=> :duplicarEnergia
>> >> atila.duplicarEnergia
=> 180
>> >> Guerrero.send(:define_method, :triplicarEnergia) { self.energia *= 3 }
=> :triplicarEnergia
>> >> atila.triplicarEnergia()
=> 540
>> >> cuadriplicador = proc { self.energia *= 4 }
=> #<Proc:0x00007fc5d09a70e8@(irb):72>
>> >> Guerrero.define_method(:energiaPorCuatro, &cuadriplicador)
=> :energiaPorCuatro
>> >> atila.energiaPorCuatro
=> 2160
>> >> class Guerrero
def quintuplicarEnergia
self.energia *= 5
end
end
>> >> >> >> => :quintuplicarEnergia
>> >> atila.quintuplicarEnergia
=> 10800
>> >> atila.quintuplicarEnergia
=> 54000
>> >> class Guerrero
def quintuplicarEnergia
self.energia *= 10
end
end
>> >> >> >> => :quintuplicarEnergia
>> >> atila.quintuplicarEnergia
=> 540000
>> >> atila.quintuplicarEnergia
=> 5400000
>> >> def atila.porDiezEnergia
>> >> self.energia *= 10
>> >> end
=> :porDiezEnergia
>> >> atila.porDiezEnergia
=> 54000000
>> >> atila.porDiezEnergia
=> 540000000
>> >> Guerrero.new().porDiezEnergia
Traceback (most recent call last):
1: from (irb):95
NoMethodError (undefined method `porDiezEnergia' for #<Guerrero:0x00007fc5d091d208>)
>> >> atila.methods(false)
=> [:porDiezEnergia]
>> >> atila.method(:porDiezEnergia)
=> #<Method: #<Guerrero:0x00007fc5d20a37d8 @potencial_ofensivo=20, @energia=540000000, @potencial_defensivo=10, @descansado=false>.porDiezEnergia>
>> >> atila.class.instance_method(:porDiezEnergia)
Traceback (most recent call last):
2: from (irb):98
1: from (irb):98:in `instance_method'
NameError (undefined method `porDiezEnergia' for class `Guerrero')
>> >> atila.singleton_class
=> #<Class:#<Guerrero:0x00007fc5d20a37d8>>
>> >> atila.singleton_class.instance_methods()
=> [:porDiezEnergia, :energiaPorCuatro, :quintuplicarEnergia, :sufri_danio, :peloton=, :descansar, :descansar_atacante, :descansar_defensor, :peloton, :lastimado, :cansado, :duplicarEnergia, :triplicarEnergia, :potencial_defensivo=, :energia, :potencial_defensivo, :energia=, :potencial_ofensivo=, :descansado, :atacar, :descansado=, :potencial_ofensivo, :construirInstancias, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :object_id, :send, :to_s, :display, :nil?, :hash, :class, :singleton_class, :clone, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :==, :instance_exec, :!=, :__id__, :__send__]
>> >> atila.singleton_class.instance_methods(false)
=> [:porDiezEnergia]
>> >> otroAtila = atila.singleton_class.new()
Traceback (most recent call last):
2: from (irb):102
1: from (irb):102:in `new'
TypeError (can't create instance of singleton class)
>> >> Peloton.methods()
=> [:cobarde, :descansador, :new, :allocate, :superclass, :<=>, :autoload, :autoload?, :<=, :>=, :==, :===, :included_modules, :include?, :name, :ancestors, :attr, :attr_reader, :attr_writer, :attr_accessor, :instance_methods, :public_instance_methods, :protected_instance_methods, :private_instance_methods, :constants, :const_get, :const_set, :const_defined?, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set, :class_variable_defined?, :public_constant, :freeze, :inspect, :deprecate_constant, :private_constant, :const_missing, :singleton_class?, :prepend, :class_exec, :module_eval, :class_eval, :include, :<, :>, :remove_method, :undef_method, :alias_method, :protected_method_defined?, :module_exec, :method_defined?, :public_method_defined?, :to_s, :public_class_method, :private_method_defined?, :instance_method, :private_class_method, :define_method, :public_instance_method, :construirInstancias, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :=~, :!~, :eql?, :respond_to?, :object_id, :send, :display, :nil?, :hash, :class, :singleton_class, :clone, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :instance_exec, :!=, :__id__, :__send__]
>> >> Peloton.methods(false)
=> [:cobarde, :descansador]
>> >> Peloton.methods(:descansador)
=> [:cobarde, :descansador, :new, :allocate, :superclass, :<=>, :autoload, :autoload?, :<=, :>=, :==, :===, :included_modules, :include?, :name, :ancestors, :attr, :attr_reader, :attr_writer, :attr_accessor, :instance_methods, :public_instance_methods, :protected_instance_methods, :private_instance_methods, :constants, :const_get, :const_set, :const_defined?, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set, :class_variable_defined?, :public_constant, :freeze, :inspect, :deprecate_constant, :private_constant, :const_missing, :singleton_class?, :prepend, :class_exec, :module_eval, :class_eval, :include, :<, :>, :remove_method, :undef_method, :alias_method, :protected_method_defined?, :module_exec, :method_defined?, :public_method_defined?, :to_s, :public_class_method, :private_method_defined?, :instance_method, :private_class_method, :define_method, :public_instance_method, :construirInstancias, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :instance_variable_get, :public_methods, :instance_variables, :method, :public_method, :define_singleton_method, :public_send, :singleton_method, :extend, :pp, :to_enum, :enum_for, :=~, :!~, :eql?, :respond_to?, :object_id, :send, :display, :nil?, :hash, :class, :singleton_class, :clone, :itself, :dup, :taint, :yield_self, :untaint, :tainted?, :untrusted?, :untrust, :frozen?, :trust, :methods, :singleton_methods, :protected_methods, :private_methods, :!, :equal?, :instance_eval, :instance_exec, :!=, :__id__, :__send__]
>> >> Peloton.method(:descansador)
=> #<Method: Peloton.descansador>
>> >> Peloton.singleton_class.method(:descansador)
Traceback (most recent call last):
2: from (irb):107
1: from (irb):107:in `method'
NameError (undefined method `descansador' for class `#<Class:#<Class:Peloton>>')
>> >> Peloton.singleton_class.instance_method(:descansador)
=> #<UnboundMethod: #<Class:Peloton>#descansador>
>> >> atila.class = Peloton
Traceback (most recent call last):
1: from (irb):109
NoMethodError (undefined method `class=' for #<Guerrero:0x00007fc5d20a37d8>)
Did you mean? class
>> >> tipo = Object.new
=> #<Object:0x00007fc5d2136f10>
>> >> class Tipo end
=> nil
>> >> Tipo.include Atacante
=> Tipo
>> >> tipo = Tipo.new
=> #<Tipo:0x00007fc5d21251c0>
>> >> tipo.descansar
=> true
>> >> tipo
=> #<Tipo:0x00007fc5d21251c0 @descansado=true>
>> >> module Dolar
>> >> def precioDolar 37 end
>> >> extend
>> >> nil
>> >> end
Traceback (most recent call last):
SyntaxError ((irb):117: syntax error, unexpected tINTEGER, expecting ';' or '\n')
def precioDolar 37 end
^~
(irb):120: syntax error, unexpected keyword_end, expecting end-of-input
>> >> module PrecioDolar def precioDolar 37.54 end end
Traceback (most recent call last):
SyntaxError ((irb):121: syntax error, unexpected tFLOAT, expecting ';' or '\n')
...ecioDolar def precioDolar 37.54 end end
... ^~~~~
>> >> module PrecioDolar def precioDolar() 37.54 end end
=> :precioDolar
>> >> Guerrero.include PrecioDolar
=> Guerrero
>> >> atila.precioDolar
=> 37.54
>> >> Guerrero.extend PrecioDolar
=> Guerrero
>> >> Guerrero.new().precioDolar
=> 37.54
>> >> Tipo.extend PrecioDolar
=> Tipo
>> >> tipo
=> #<Tipo:0x00007fc5d21251c0 @descansado=true>
>> >> tipo precioDolar
Traceback (most recent call last):
1: from (irb):129
NameError (undefined local variable or method `precioDolar' for main:Object)
>> >> Tipo.precioDolar
=> 37.54
>> >> Tipo new
Traceback (most recent call last):
1: from (irb):131
NameError (undefined local variable or method `new' for main:Object)
>> >> Tipo.new
=> #<Tipo:0x00007fc5d200e728>
>> >> Tipo.new().precioDolar
Traceback (most recent call last):
1: from (irb):133
NoMethodError (undefined method `precioDolar' for #<Tipo:0x00007fc5d101be88>)
>> >> Tipo.methods(false)
=> []
>> >> Tipo.ancestors
=> [Tipo, Atacante, Object, Kernel, BasicObject]
>> >> Tipo.singleton_class.ancestors
=> [#<Class:Tipo>, PrecioDolar, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
>> >> class EntiendeTodo
def saludar
"Hola"
end
def method_missing(symbol, *args)
"No se #{symbol}(#{args})"
end
end
>> >> >> >> >> >> >> >> => :method_missing
>> >> >> >> e = EntiendeTodo new
Traceback (most recent call last):
1: from (irb):148
NameError (undefined local variable or method `new' for main:Object)
>> >> e = EntiendeTodo.new
=> #<EntiendeTodo:0x00007fc5d212d578>
>> >> e.saludar
=> "Hola"
>> >> e.fruta
=> "No se fruta([])"
>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment