Cadena vacia devulve true

Hola,

Se que es una pregunta muy simple pero no entiendo el funcionamiento de
Ruby en estos casos.

Un metodo esta devolviendome una cadena vacia pero desde donde lo llamo
recibo un true. Un objeto TrueClass. Tiene sentido??

Como puedo, pues, devolver una cadena vacia y obtenerla tal cual??

Raúl.

explica un poco mas tu problema
muestranos un poco de tu codigo para que podamos ayudarte.

ayudanos a ayudarte

El 16 de junio de 2009 11:48, Raul M. <
[email protected]> escribió:

2009/6/16 Raul M. [email protected]:

Raúl.

Hola
Raúl,
Explica por favor un poco más el problema porque me temo que te has
saltado algún detalle, en principio Ruby funciona como esperas:

$ irb
irb(main):001:0> def empty
irb(main):002:1> “”
irb(main):003:1> end
=> nil
irb(main):004:0> empty
=> “”
irb(main):005:0> empty.class
=> String

Un saludo,


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras

Tengo algo así…

def method2!(params)

result = ""

begin
  ...
rescue Exception1 => e
  result = "Error1"
rescue Exception2 => e
  result = "Error2"
ensure
  ...

  result
end

end

def method1

...

result = method2!(params)

respond_to do |format|

  if result.empty?
    format.html { redirect_to root_url }
  else
    format.html {
      logger.error result
      render :action => :new
    }
  end

end

end

El tema está en que cuando comprobaba el valor de vuelta en
“result.empty?” me cascaba advirtiendome que el metodo no existe en
TrueClass.

No se si se verá más claro…

Raúl.

On Wed, Jun 17, 2009 at 1:06 PM, Raul M. <
[email protected]> wrote:

 result = "Error2"

ensure

 result

end
end

Te falta un return en el ensure para forzar que el valor devuelto sea
result, me explico:

def a
true
ensure
false
end

def b
return true
ensure
return false
end

a
=> true

b
=> false

El caso es… eso hará que no me transforme la cadena vacia a
TrueClass??

Saludos,
Raúl.

Muchas gracias Xavier,

Mucho me temo que lo que pasaba es que no entendía como funcionaba la
captura de las excepciones. Mi idea era que el valor de retorno de la
funcion era el de la ejecucion de la ultima sentencia dentro del ensure.

He corregido el codigo y ahora ya funciona como esperaba. Los
“Poltergeist” y cosas raras mejor para el cine…

Gracias de nuevo,
Raúl.

On Wed, Jun 17, 2009 at 1:06 PM, Raul
Martinez[email protected] wrote:

  ensure
   …

   result
  end
end

Eso esta bastante raro.

El valor de un begin/rescue si no salta ninguna excepcion es el de la
ultima expresion en el begin, o la ultima de la clausula else si esta
existe. Si salta una excepcion y se captura en una clausula rescue, el
valor del begin/rescue es de la ultima expresion de dicha clausula.

Si salta una excepcion y no se captura no hay valor de retorno ya que
la expresion se tira para arriba al caller.

Como ves, la clausula ensure no pinta nada en cuanto al valor de
retorno (si bien tecnicamente se puede usar return ahi).

Podria ser que lo que quieras sea una clausula else en lugar de una
ensure?

Naturalmente siempre puedes devolver result poniendolo al final del
metodo, fuera del begin/rescue, pero antes miraria si el ensure esta
bien usado.