2010-02-15 10 views
9

¿Cómo puedo activar una función, en ruby, como la siguiente?Ruby: ¿Cómo cambio el valor de un parámetro en una llamada a función?

change_me! (val) 

actualización:

lo que me había que hacer era esto:

def change_me! (val) 
    val = val.chop while val.end_with? '#' or val.end_with? '/' 
end 

Esto sólo terminó con ....

change_me! 'test#///'  => "test#///" 
+0

Lo que está tratando de hacer tornillos con alcance. Cuando llama a una función, cambia de ámbito, por lo que no funcionará de la manera que desee. Tendrás que jugar con 'define_method', que es demasiado para esto. Necesitas refactorizar tu proceso de pensamiento. – Trevoke

+0

@Trevoke Lo que zombies intenta sería posible con pass-by-pointer o pass-by-reference. Sin embargo, ruby ​​no hace eso. Puede modificar el interior del objeto pasado, pero no el objeto en sí. Pero puedes reemplazar completamente lo que está almacenado en el objeto. – hurikhan77

Respuesta

18

Eres pensando en esto al revés. Si bien es posible hacer esto en Ruby, sería demasiado complicado. La forma correcta de hacer esto sería:

val.change_me! 

cual, por supuesto, varía en función de la clase de lo que desea cambiar. El punto es que, por convención, los métodos con '!' afectar la instancia de clase en la que se llaman. Así ...

class Changeable 
    def initialize var 
    @var = var 
    end 

    def change_me! change=1 
    @var += change 
    end 
end 

a = Changeable.new 5 # => New object "Changeable", value 5 
a.change_me! 6 # => @var = 7 
a.change_me! # => @var = 8 

Espero que esto ayude un poco ..

+0

Ah, eso lo aclara. Un poco de nuuby aquí gracias. – Zombies

+3

esto no funcionará para todo tipo de parámetros, por ejemplo matrices o hash – ennuikiller

+0

ennuikiller: tienes razón. Solo quiero ilustrar la idea. – Trevoke

2

¿Qué tipo de objeto es val y cómo quiere usted para cambiarlo? Si lo que desea es mutar un objeto (por ejemplo, una matriz o una cadena), lo que está pidiendo para las obras directamente:

def change_me!(me) 
    me << 'abides' 
end 

val = %w(the dude) 
change_me!(val) 
puts val.inspect 

val = "the dude " 
change_me!(val) 
puts val.inspect 
+0

Entonces, lo que realmente estoy preguntando es cómo mutar los objetos. Más bien, escriba mi propio método que muta un objeto ... – Zombies

8

usted quiere hacer esto:

def change_me(val) 
    val.replace "#{val}!" 
end 

Este reemplazar el valor con uno nuevo Pero confía en mí: normalmente no deseas diseñar tu código ruby ​​de esa manera. Comienza a pensar en objetos y clases. Diseña tu código sin efectos secundarios. Salvará muchos problemas.

+0

Esto me produce escalofríos y me recuerda el error en COBOL donde se puede cambiar el valor de 1 a ser 2. Es bastante parecido a lo que el OP solicitó sin embargo :) – Trevoke

+0

@Trevoque afortunadamente Ruby no se ve afectado por este error, aunque sería interesante generar cosas como 2 + 2 = 5 ;-) – hurikhan77

+0

@ hurikhan77, eso es fácil de hacer: 'clase Fixnum; alias: old_ +: +; def + (otro); self == 2 && other == 2?5: viejo _ + (otro); end end' –

Cuestiones relacionadas