Diferencia entre Hashes

Hola que tal.

Me preguntaba si hay algun metodo que haga lo siguiente:

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

Gracias por adelanteado.

On Jan 14, 2008, at 6:35 PM, Edgar J. Suarez wrote:

Me preguntaba si hay algun metodo que haga lo siguiente:

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

Hmmm… el delete_if se invocaria sobre options?

– fxn

Xavier N. wrote:

Hmmm… el delete_if se invocaria sobre options?

– fxn

No, mas bien sobre el resultado del merge entre DEFAULT_OPTIONS y
options.

La idea es sobreescribir los valores de DEFAULT_OPTIONS con los que
aparezcan en options (merge, para tener aun los que no se sobreescriben)
pero sin incluir valores extras que puedan venir en options.

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

lo hace bien, solo me pregunto si hay un metodo que lo haga “en una sola
llamada”.

Edgar J. Suarez wrote:

Xavier N. wrote:

Hmmm… el delete_if se invocaria sobre options?

– fxn

No, mas bien sobre el resultado del merge entre DEFAULT_OPTIONS y
options.

La idea es sobreescribir los valores de DEFAULT_OPTIONS con los que
aparezcan en options (merge, para tener aun los que no se sobreescriben)
pero sin incluir valores extras que puedan venir en options.

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

lo hace bien, solo me pregunto si hay un metodo que lo haga “en una sola
llamada”.

Ah, mas bien si… se me fue la ebra jeje. Si, el delete_if al final si
se invocaria sobre options.

On Jan 14, 2008, at 6:43 PM, Xavier N. wrote:

On Jan 14, 2008, at 6:35 PM, Edgar J. Suarez wrote:

Me preguntaba si hay algun metodo que haga lo siguiente:

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

Hmmm… el delete_if se invocaria sobre options?

Nah, seria equivalente, me extraño el delete_if fuera pero el
resultado es el mismo.

La unica alternativa que se me ocurre que merezca la pena comentar es
una que usa Rails bastante internamente. Se trata de un metodo de
Active Support llamado Hash#assert_valid_keys que lanza ArgumentError:

options.assert_valid_keys(*DEFAULT_OPTIONS.keys)
# si pasa toda llave de options esta en DEFAULT_OPTIONS

Esta opcion no es la misma que la tuya, porque la tuya no considera
como error el pasar una llave desconocida.

Edgar J. Suarez wrote:

Edgar J. Suarez wrote:

Xavier N. wrote:

Hmmm… el delete_if se invocaria sobre options?

– fxn

No, mas bien sobre el resultado del merge entre DEFAULT_OPTIONS y
options.

La idea es sobreescribir los valores de DEFAULT_OPTIONS con los que
aparezcan en options (merge, para tener aun los que no se sobreescriben)
pero sin incluir valores extras que puedan venir en options.

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

lo hace bien, solo me pregunto si hay un metodo que lo haga “en una sola
llamada”.

De hecho, no lo hace correctamente… debido a mi avionazo, no se borran
los valores de options.
Mas bien tendria que ser asi:

options = AJAXFUL_OPTIONS.merge(options)
_options = options.delete_if { |k, v| !AJAXFUL_OPTIONS.has_key?(k) }

Como comentas, no quiero que lance un error si se pasa una llave
desconocida, mas bien quiero quedarme con options “limpia”, y con
_options “actualizada”.

Gracias.

Edgar J. Suarez wrote:

De hecho, no lo hace correctamente… debido a mi avionazo, no se borran
los valores de options.
Mas bien tendria que ser asi:

options = AJAXFUL_OPTIONS.merge(options)
_options = options.delete_if { |k, v| !AJAXFUL_OPTIONS.has_key?(k) }

Como comentas, no quiero que lance un error si se pasa una llave
desconocida, mas bien quiero quedarme con options “limpia”, y con
_options “actualizada”.

Gracias.

Y no… esto tampoco sirve.

Si se hace en una sola linea:

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

“semi funciona” porque en realidad el delete_if se invoca sobre una
variable imaginaria??.

Tendria que hacerlo en mas lineas para que elimine las opciones de
options… entonces solo habria que validar si realmente es necesario.

Hmmm, se puso mas interesante de lo que pensaba.

Edgar J. Suarez wrote:

De hecho, no lo hace correctamente… debido a mi avionazo, no se borran
los valores de options.
Mas bien tendria que ser asi:

options = AJAXFUL_OPTIONS.merge(options)
_options = options.delete_if { |k, v| !AJAXFUL_OPTIONS.has_key?(k) }

Como comentas, no quiero que lance un error si se pasa una llave
desconocida, mas bien quiero quedarme con options “limpia”, y con
_options “actualizada”.

Gracias.

Ahmm… AJAXFUL_OPTIONS = DEFAULT_OPTIONS.

Debo poner mas atencion antes de escribir u_u

Edgar J. Suarez wrote:

Y no… esto tampoco sirve.

Si se hace en una sola linea:

_options = DEFAULT_OPTIONS.merge(options).delete_if { |k, v|
!DEFAULT_OPTIONS.has_key?(k) }

“semi funciona” porque en realidad el delete_if se invoca sobre una
variable imaginaria??.

Tendria que hacerlo en mas lineas para que elimine las opciones de
options… entonces solo habria que validar si realmente es necesario.

Hmmm, se puso mas interesante de lo que pensaba.

Resulta que no importa si hay keys extra en _options, eso me simplifica
las cosas a dos lineas:

_options = DEFAULT_OPTIONS.merge(options)
options.delete_if { |k, v| DEFAULT_OPTIONS.has_key?(k) }

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs