2011-03-10 19 views
16

¿Puedo devolver nada en rubí?Can Ruby no baja nada?

Sólo para fines educativos

Por ejemplo:

myarray = [1,2,3] 
myarray << some_method 

def some_method 
    if Date.today.day > 15 
    return "Trololo" 
    else 
    return __NOTHING__ 
    end 
end 

Así, si hoy es 11'th de marzo myarray no agregará nuevo elemento. No quiero nil - porque nil no es nada :)

Y entiendo, que puedo usar if | unless declaración como myarray << some_method if some_method etc. Quiero entender puedo volver nada o cada vez en rubí Estoy volviendo algo (lo mínimo que puedo obtener es Nil Object)

Respuesta

20

Básicamente, lo que estás buscando es una declaración . Pero Ruby no tiene declaraciones, solo expresiones. Todo es una expresión, es decir, todo devuelve un valor.

9

No, no puede devolver nada. En ruby, siempre devuelve algo (incluso si es solo nil), no hay forma de evitarlo.

+7

Dicho esto, 'las negativas se supone que representa el concepto de 'nada'. –

2

Nada no significa nada para ruby ​​por lo que sé :) Sin embargo, puedes definir tu propia nada y tirarla tanto como sea posible. En ruby, si no devuelve algo explícitamente, se devuelve la última expresión evaluada.

5

No se puede devolver "nada" de un método en ruby. Como usted señala, podría agregar elementos de manera condicional a su matriz. También puede invocar .compact en su matriz para eliminar todos los elementos nulos.

5

No puede devolver nada real con Ruby. Todo es un objeto Pero puedes crear un falso. Nada para hacerlo. Ver:

Nothing = Module.new # Same as module Nothing; end 
class Array 
    alias old_op_append << 
    def <<(other) 
    if other == Nothing 
     self 
    else 
     old_op_append(other) 
    end 
    end 
end 

Esto es feo pero funciona en su muestra. (Nada sigue siendo un objeto.)

+0

pirateo interesante. Puede ser útil. – fl00r

0

Puede simular Nada con excepciones.

class NothingError < RuntimeError 
end 

def nothing 
    raise NothingError 
end 

def foo x 
    if x>0 then x else nothing end 
end 

def nothingness 
    begin 
    yield 
    rescue NothingError 
    end 
end 

a = [1,2,3] 
nothingness { a << foo(4) } 
nothingness { a << foo(0) } 

Probablemente no sea una gran idea, sin embargo ...

+0

Podría usar 'a << foo (4) rescatar NothingError' en lugar de nada ... –