¿Qué método se necesita para tener el - método (resta) trabajar con matrices Ruby “”?
-
11-09-2019 - |
Pregunta
Si tengo dos matrices a
y b
, ¿qué método debe tener el objeto contenido para anular lo que el método de resta -
funciona correctamente?
¿Es suficiente con eql?
Editar
Estoy añadiendo más detalles a mi pregunta.
Tengo esta clase define:
class Instance
attr_reader :id, :desc
def initialize( id , desc )
@id = id.strip
@desc = desc.strip
end
def sameId?( other )
@id == other.id
end
def eql?( other )
sameId?( other ) and @desc == other.desc
end
def to_s()
"#{id}:#{desc}"
end
end
Ok?
A continuación, he llenado mis dos matrices de diferentes partes y quiero conseguir la diferencia.
a = Instance.new("1","asdasdad")
b = Instance.new("1","a")
c = Instance.new("1","a")
p a.eql?(b) #false
p b.eql?(c) #true
x = [a,b]
y = [c]
z = x - y # should leave a because b and c "represent" the same object
Sin embargo, esto no está funcionando, porque a
y b
se mantienen en la matriz. Me pregunto qué método que necesito para anular en mi clase para que esto funcione correctamente.
Solución
Es necesario redefinir #eql?
y la de hash método.
Es posible definirlo como:
def hash
id.hash + 32 * desc.hash
end
detalles:
Para ver lo que se llama en Ruby 1.9:
% irb
>> class Logger < BasicObject
>> def initialize(delegate)
>> @delegate = delegate
>> end
>> def method_missing(m,*args,&blk)
>> ::STDOUT.puts [m,args,blk].inspect
>> @delegate.send(m,*args,&blk)
>> end
>> end
=> nil
>> object = Logger.new(Object.new)
[:inspect, [], nil]
=> #<Object:0x000001009a02f0>
>> [object] - [0]
[:hash, [], nil]
[:inspect, [], nil]
=> [#<Object:0x000001009a02f0>]
>> zero = Logger.new(0)
[:inspect, [], nil]
=> 0
>> [zero] - [0]
[:hash, [], nil]
[:eql?, [0], nil]
=> []
Lo mismo es cierto en Ruby 1.8.7
% irb18
>> class Logger < Object
>> instance_methods.each { |m| undef_method m }
>> def initialize(delegate)
>> @delegate = delegate
>> end
>> def method_missing(m,*args,&blk)
>> ::STDOUT.puts [m,args,blk].inspect
>> @delegate.send(m,*args,&blk)
>> end
>> end
(irb):2: warning: undefining `__send__' may cause serious problem
(irb):2: warning: undefining `__id__' may cause serious problem
=> nil
>> object = Logger.new(Object.new)
[:inspect, [], nil]
=> #<Object:0x100329690>
>> [object] - [0]
[:hash, [], nil]
[:inspect, [], nil]
=> [#<Object:0x100329690>]
>> zero = Logger.new(0)
[:inspect, [], nil]
=> 0
>> [zero] - [0]
[:hash, [], nil]
[:eql?, [0], nil]
=> []
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow