Forum: Rails-ES Cadena vacia devulve true

Posted by Raul Martinez (raul_mpad)
on 2009-06-16 18:48
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.
Posted by Omar Jimenez (Guest)
on 2009-06-16 19:06
(Received via mailing list)
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 Martinez <
ruby-forum-incoming@andreas-s.net> escribió:
Posted by Sergio Gil Pérez de la Manga (Guest)
on 2009-06-16 19:28
(Received via mailing list)
2009/6/16 Raul Martinez <ruby-forum-incoming@andreas-s.net>:
> 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 > sgilperez@gmail.com
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras
Posted by Raul Martinez (raul_mpad)
on 2009-06-17 13:06
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.
Posted by Guillermo (Guest)
on 2009-06-17 13:12
(Received via mailing list)
On Wed, Jun 17, 2009 at 1:06 PM, Raul Martinez <
ruby-forum-incoming@andreas-s.net> 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
Posted by Raul Martinez (raul_mpad)
on 2009-06-17 13:27
El caso es... eso hará que no me transforme la cadena vacia a 
TrueClass??

Saludos,
Raúl.
Posted by Xavier Noria (fxn)
on 2009-06-18 00:36
(Received via mailing list)
On Wed, Jun 17, 2009 at 1:06 PM, Raul
Martinez<ruby-forum-incoming@andreas-s.net> 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.
Posted by Raul Martinez (raul_mpad)
on 2009-06-18 17:02
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.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.