[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Extend an object with module stored

Andrea Reginato

1/31/2006 4:11:00 PM

I would like extend dynamically an object with one or more Module that I
save into an Hash (I now only this way).

-----------------------------
categorie << Categoria.new('Definizioni Testuali', {:name_module =>
ListaDefinizioni, })
categorie << Categoria.new('Definizioni Testuali', {:name_module =>
ListaDefinizioni, :name_module => ListaDefinizioniEditor})
-----------------------------

Then I have store this information in a YAML file, but when I dump the
hash I lost the info about the module.

-----------------------------
--- !ruby/array:Categorie
- !ruby/object:Categoria
descrizione: Definizioni Testuali
estensioni: # MY HASH
:name_module: !ruby/object:Module {}
- !ruby/object:Categoria
descrizione: Definizioni Testuali
estensioni: # MY HASH
:name_module: !ruby/object:Module {}
-----------------------------

So when I try to extend, nothing to do.
This code do not give me errors, but it do not extend my object.

-----------------------------
# @categoria.extension is the hash with the module
@categoria.estensioni.each_value { |estensione| @denotato.send('extend',
estensione) }
-----------------------------

Do you know some tecnique to extend an Object with module stored in YAML
file?
Thanks so much to all for the help.

--Reis

--
Posted via http://www.ruby-....


4 Answers

Joel VanderWerf

1/31/2006 7:10:00 PM

0

Andrea Reginato wrote:
> I would like extend dynamically an object with one or more Module that I
> save into an Hash (I now only this way).
>
> -----------------------------
> categorie << Categoria.new('Definizioni Testuali', {:name_module =>
> ListaDefinizioni, })
> categorie << Categoria.new('Definizioni Testuali', {:name_module =>
> ListaDefinizioni, :name_module => ListaDefinizioniEditor})
> -----------------------------
>
> Then I have store this information in a YAML file, but when I dump the
> hash I lost the info about the module.
>
> -----------------------------
> --- !ruby/array:Categorie
> - !ruby/object:Categoria
> descrizione: Definizioni Testuali
> estensioni: # MY HASH
> :name_module: !ruby/object:Module {}
> - !ruby/object:Categoria
> descrizione: Definizioni Testuali
> estensioni: # MY HASH
> :name_module: !ruby/object:Module {}
> -----------------------------
>
> So when I try to extend, nothing to do.
> This code do not give me errors, but it do not extend my object.
>
> -----------------------------
> # @categoria.extension is the hash with the module
> @categoria.estensioni.each_value { |estensione| @denotato.send('extend',
> estensione) }
> -----------------------------
>
> Do you know some tecnique to extend an Object with module stored in YAML
> file?
> Thanks so much to all for the help.
>
> --Reis
>

I had some code to serialize module and class identities (without any of
their instance variables or class variables, though) with 1.8.2 (see
below) but it seems not to work with 1.8.4. I will take a look at it
later today.


class Module
def is_complex_yaml?
false
end
def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out << "!ruby/module "
self.name.to_yaml( :Emitter => out )
}
end
end
YAML.add_ruby_type(/^module/) do |type, val|
subtype, subclass = YAML.read_type_class(type, Module)
val.split(/::/).inject(Object) { |p, n| p.const_get(n)}
end

class Class
def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out << "!ruby/class "
self.name.to_yaml( :Emitter => out )
}
end
end
YAML.add_ruby_type(/^class/) do |type, val|
subtype, subclass = YAML.read_type_class(type, Class)
val.split(/::/).inject(Object) { |p, n| p.const_get(n)}
end

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


Eero Saynatkari

1/31/2006 7:20:00 PM

0

Andrea Reginato wrote:
> I would like extend dynamically an object with one or more Module that I
> save into an Hash (I now only this way).
>
> -----------------------------
> categorie << Categoria.new('Definizioni Testuali', {:name_module =>
> ListaDefinizioni, })
> categorie << Categoria.new('Definizioni Testuali', {:name_module =>
> ListaDefinizioni, :name_module => ListaDefinizioniEditor})
> -----------------------------
>
> Then I have store this information in a YAML file, but when I dump the
> hash I lost the info about the module.
>
> < snip YAML />
>
> So when I try to extend, nothing to do.
> This code do not give me errors, but it do not extend my object.
>
> -----------------------------
> # @categoria.extension is the hash with the module
> @categoria.estensioni.each_value { |estensione| @denotato.send('extend',
> estensione) }
> -----------------------------
>
> Do you know some tecnique to extend an Object with module stored in YAML
> file?
> Thanks so much to all for the help.

I assume that the module used may vary from object to
object (otherwise it is not necessary to to serialize
it, of course)?

One simple thing you could do would be to store the
*name* of the module instead of the constant. Then,
after loading the YAML, you can use Module#const_get
to obtain the constant again.

> --Reis


E

--
Posted via http://www.ruby-....


Joel VanderWerf

1/31/2006 7:49:00 PM

0

Joel VanderWerf wrote:
> I had some code to serialize module and class identities (without any of
> their instance variables or class variables, though) with 1.8.2 (see
> below) but it seems not to work with 1.8.4. I will take a look at it
> later today.

Here's a version for 1.8.4. Are you listening, _why, and is there a
chance of putting this in the YAML lib?

----------------------------------
Sample code:
----------------------------------
yy = [Enumerable, Comparable, String, File].to_yaml
puts yy
p YAML.load(yy)

----------------------------------
Output:
----------------------------------
---
- !ruby/module Enumerable
- !ruby/module Comparable
- !ruby/class String
- !ruby/class File
[Enumerable, Comparable, String, File]

----------------------------------
Implementation:
----------------------------------
require 'yaml'

class Module
yaml_as "tag:ruby.yaml.org,2002:module"

def Module.yaml_new( klass, tag, val )
if String === val
val.split(/::/).inject(Object) {|m, n| m.const_get(n)}
else
raise YAML::TypeError, "Invalid Module: " + val.inspect
end
end

def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out.scalar( "tag:ruby.yaml.org,2002:module", self.name, :plain )
}
end
end

class Class
yaml_as "tag:ruby.yaml.org,2002:class"

def Class.yaml_new( klass, tag, val )
if String === val
val.split(/::/).inject(Object) {|m, n| m.const_get(n)}
else
raise YAML::TypeError, "Invalid Class: " + val.inspect
end
end

def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out.scalar( "tag:ruby.yaml.org,2002:class", self.name, :plain )
}
end
end

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


Andrea Reginato

2/1/2006 3:55:00 PM

0

Joel VanderWerf wrote:
> Joel VanderWerf wrote:
>> I had some code to serialize module and class identities (without any of
>> their instance variables or class variables, though) with 1.8.2 (see
>> below) but it seems not to work with 1.8.4. I will take a look at it
>> later today.
>
> Here's a version for 1.8.4. Are you listening, _why, and is there a
> chance of putting this in the YAML lib?
>

I will try in the next days.

> ----------------------------------
> Sample code:
> ----------------------------------
> yy = [Enumerable, Comparable, String, File].to_yaml
> puts yy
> p YAML.load(yy)
>
> ----------------------------------
> Output:
> ----------------------------------
> ---
> - !ruby/module Enumerable
> - !ruby/module Comparable
> - !ruby/class String
> - !ruby/class File
> [Enumerable, Comparable, String, File]

Thanks for the answer.
--Reis

--
Posted via http://www.ruby-....