TheYAML change the id of Object

A

Andrea

I'm using an hash object and i use a Termine Object for the key and, for
now, a String for the value.
The class Termine is this:

class Termine
DEFAULT_LANG = "it"
attr_accessor :descrizione
attr_accessor :lingua
def initialize(descrizione="", lingua=DEFAULT_LANG)
@descrizione = descrizione
@lingua = lingua
end
end

In my test file all is good (compare, edit, delete and reference), but
if I dump all in a file YAML and then I load the file YAML the equal
assertion have a failure.
The attributes 'descrizione' and 'lingua' on the key are the same, but
the problem is that the id of the object is changed... and so there is
the failure.

test_yaml: before hash dump
#<Termine:0x2ada6a8>:Key T4 in lingua it -- Value: Definizione uno
#<Termine:0x2ada720>:Key T3 in lingua it -- Value: Definizione tre
#<Termine:0x2ada750>:Key T2 in lingua it -- Value: Definizione due
#<Termine:0x2ada780>:Key T1 in lingua it -- Value: Definizione uno

test_yaml: after dump (is clear)

test_yaml: after load
#<Termine:0x2ad6400>:Key T4 in lingua it -- Value: Definizione uno
#<Termine:0x2ad5f20>:Key T3 in lingua it -- Value: Definizione tre
#<Termine:0x2ad5a40>:Key T2 in lingua it -- Value: Definizione due
#<Termine:0x2ad5518>:Key T1 in lingua it -- Value: Definizione uno

How can I solve this problem?

Thanks to all for the help...
--Andrea.
 
L

Logan Capaldo

I'm using an hash object and i use a Termine Object for the key
and, for
now, a String for the value.
The class Termine is this:

class Termine
DEFAULT_LANG = "it"
attr_accessor :descrizione
attr_accessor :lingua
def initialize(descrizione="", lingua=DEFAULT_LANG)
@descrizione = descrizione
@lingua = lingua
end
end

In my test file all is good (compare, edit, delete and reference), but
if I dump all in a file YAML and then I load the file YAML the equal
assertion have a failure.
The attributes 'descrizione' and 'lingua' on the key are the same, but
the problem is that the id of the object is changed... and so there is
the failure.

test_yaml: before hash dump
#<Termine:0x2ada6a8>:Key T4 in lingua it -- Value: Definizione uno
#<Termine:0x2ada720>:Key T3 in lingua it -- Value: Definizione tre
#<Termine:0x2ada750>:Key T2 in lingua it -- Value: Definizione due
#<Termine:0x2ada780>:Key T1 in lingua it -- Value: Definizione uno

test_yaml: after dump (is clear)

test_yaml: after load
#<Termine:0x2ad6400>:Key T4 in lingua it -- Value: Definizione uno
#<Termine:0x2ad5f20>:Key T3 in lingua it -- Value: Definizione tre
#<Termine:0x2ad5a40>:Key T2 in lingua it -- Value: Definizione due
#<Termine:0x2ad5518>:Key T1 in lingua it -- Value: Definizione uno

How can I solve this problem?

Thanks to all for the help...
--Andrea.

You need to overload the == operator and the hash method.

class Termine
alias eql? ==
def ==(other)
descrizione == other.descrizione and lingua == other. lingua
end
def hash
(descrizione + lingua).hash
end
end

t = Termine.new("Hi")
t2 = Termine.new("Hi")

t == t2 #=> true

h = {}
h[t] = "short hello"
h #=> {#<Termine:0x24a22c @lingua="it", @descrizione="Hi">=>"short
hello"}
h.has_key?(t2) #=> true
 
A

Andrea

Logan said:
@descrizione = descrizione

#<Termine:0x2ad5f20>:Key T3 in lingua it -- Value: Definizione tre
You need to overload the == operator and the hash method.

class Termine
alias eql? ==
def ==(other)
descrizione == other.descrizione and lingua == other. lingua
end
def hash
(descrizione + lingua).hash
end
end

t = Termine.new("Hi")
t2 = Termine.new("Hi")

t == t2 #=> true

h = {}
h[t] = "short hello"
h #=> {#<Termine:0x24a22c @lingua="it", @descrizione="Hi">=>"short
hello"}
h.has_key?(t2) #=> true


Thank for your help... this is that I need...
--Andrea
 
L

Logan Capaldo

I'm using an hash object and i use a Termine Object for the key
and, for
now, a String for the value.

You need to overload the == operator and the hash method.

class Termine
alias eql? ==
def ==(other)
descrizione == other.descrizione and lingua == other.
lingua
end
def hash
(descrizione + lingua).hash
end
end

t = Termine.new("Hi")
t2 = Termine.new("Hi")

t == t2 #=> true

h = {}
h[t] = "short hello"
h #=> {#<Termine:0x24a22c @lingua="it", @descrizione="Hi">=>"short
hello"}
h.has_key?(t2) #=> true

I was playing around with this, and now I'm doubly worried I have a
bug, or have missed something else. The last line in your code
gives out 'false' for me. I was experimenting with this:

class Dclz
@str = "A string"
attr_reader :str

def ==(o)
self.str == o.str
end

def ===(o)
self.str === o.str
end

def hash
self.str.hash
end
end

case Dclz.new
when Dclz.new
puts "Works"
else
puts "doesn't"
end # => "Works"

h = Hash.new { "Failure" }
h[d = Dclz.new] = "Expected"

puts Dclz.new == Dclz.new # => true
puts Dclz.new.hash == Dclz.new.hash # => true

puts h[d] # => "Expected"
puts h[Dclz.new] # => "Failure"
huh????!!!!

And I cannot understand what's happening here. Someone, please
confirm that I'm either sane or stupid?

(Tried on both ruby 1.8.3 (2005-09-21) [i386-linux] and ruby 1.9.0
(2005-12-16) [i686-linux])

As ts already mentioned, you missed the eql? part. Me aliasing it to
== and implementing == instead is a function of my C++ (as opposed to
lisp or smalltalk(?) ) upbringing.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,600
Members
45,179
Latest member
pkhumanis73
Top