2012-02-02 16 views
6

Entonces, ¿es solo el operador de pala el que modifica la cadena original? ¿Por qué este trabajo, parece que:Me gustaría una explicación de un comportamiento en Ruby que encontré en los Koans

hi = original_string 

está actuando como una especie de un puntero? ¿Puedo obtener una idea de cuándo, cómo y por qué esto se comporta así?

def test_the_shovel_operator_modifies_the_original_string 
    original_string = "Hello, " 
    hi = original_string 
    there = "World" 
    hi << there 
    assert_equal "Hello, World", original_string 

    # THINK ABOUT IT: 
    # 
    # Ruby programmers tend to favor the shovel operator (<<) over the 
    # plus equals operator (+=) when building up strings. Why? 
    end 
+1

posible duplicado de [¿Por qué es preferible el operador de pala (<<) a más-igual (+ =) al construir un hilo en Ruby?] (Http://stackoverflow.com/questions/4684446/why-is- the-shovel-operator-preferred-over-plus-equals-when-building-a) –

+1

No estoy de acuerdo en que sea un duplicado. Me pregunto por qué el operador = se comporta de la manera en que lo hace, no por qué se prefiere el operador <<. –

+0

La información que necesita es un subconjunto de la información proporcionada allí. Echar un vistazo. –

Respuesta

8

En ruby, todo es una referencia. Si lo hace foo = bar, ahora foo y bar son dos nombres para el mismo objeto.

Sin embargo, si lo hace foo = foo + bar (o, equivalentemente, foo += bar), foo ahora se refiere a un nuevo objeto: uno que es el resultado del cálculo foo + bar.

+0

Bueno, eso tiene sentido. ¡Gracias! –

2

Una cadena es tan sólo caracteres secuencia os, el operador < < le permite añadir más personajes para esta secuencia. Algunos lenguajes tienen cadenas inmutables, como Java y C#, otros tienen cadenas mutables, como C++, no hay nada de malo en eso, es algo que los diseñadores de lengua sintieron que era necesario.

En Java, cuando necesita crear una cadena grande combinando muchas cadenas más pequeñas, primero debe usar un StringBuilder y luego, al final, crear una cadena de caracteres real. En Ruby puedes seguir usando < < para agregar más caracteres a esa cadena y eso es todo.

La diferencia principal es que el uso de < < es mucho más rápido que "one_string + other_string" porque el operador + genera una nueva cadena en lugar de añadir a one_string.

3

está actuando como una especie de un puntero

Se llama la semántica de referencia. Al igual que en Python, las variables de Ruby se refieren a valores, en lugar de contenerlos. Esto es normal para los lenguajes de tipado dinámico, ya que es mucho más fácil implementar la lógica "los valores tienen tipo, las variables no" cuando la variable siempre es solo una referencia en lugar de algo que tiene que cambiar mágicamente de tamaño para contener diferentes tipos de valores.

En cuanto al koan real, vea Why is the shovel operator (<<) preferred over plus-equals (+=) when building a string in Ruby?.

+0

Gracias por el consejo sobre la comprensión del koan, así como la explicación de que la variable es una referencia. –

Cuestiones relacionadas