Mayo 31, 2024

Primeros pasos con Ruby: Strings y Symbols

ruby strings symbols

Ruby

En Ruby, tanto las cadenas de texto (strings) como los símbolos (symbols) son tipos de datos fundamentales. Aunque pueden parecer similares, tienen diferencias importantes en términos de propósito, uso y comportamiento interno. Pueden definirse con comillas simples (‘’) o dobles (“”). Aquí te proporcionaré lo mas importante de estas diferencias y sus usos recomendados.

Strings

Un string es una serie de caracteres o bytes utilizados para almacenar texto o datos binarios. Los strings en Ruby son mutables, es decir, pueden modificarse después de ser creados.

Creación:

string = "I am a string!"
another_string = 'I am also a string!'

Mutabilidad:

Los strings pueden modificarse en Ruby. Cada vez que se crea un string, se asigna un nuevo espacio de memoria y un object_id único.

:001 > "hello".object_id
=> 70102163173680
:002 > "hello".object_id
=> 70102163111540

Concatenación:

four = "Four "
legs = "legs!"
fourlegs = four + legs # "Four legs!"

Concatenación con += y <<:

four += legs  # Modifica la variable original
four << legs  # Modifica la variable original

Acceso a Substrings y Caracteres:

string = "This is fun!"
string[1]     # "h"
string[-1]    # "!"

string = "Potatoes!"
string[4..8]  # "toes!"
string[4,5]   # "toes!"

Interpolación:

La interpolación solo se puede lograr con las comillas dobles. Ya que las comillas dobles activan un nivel más alto de interpretación en Ruby, mientras que las comillas simples son más literales y no interpretan contenido en ellas. Esto proporciona flexibilidad para manejar diferentes tipos de cadenas según las necesidades del programador.

passes = 6
"I think I got #{passes} bags of doritos today."  # "I think I got 6 bags of doritos today."

"The square root of 9 is #{Math.strt(9)}"         # "The square root of 9 is 3"

Dividir y Unir cadenas:

string = "Armbar Triangle Omoplata"
drills = string.split         # ["Armbar", "Triangle", "Omoplata"]

string = "Justin,Lucy,Otto"
coolfolks = string.split(/,/) # ["Justin", "Lucy", "Otto"]

array = ["Initiate", "ultimate", "passing", "combo"]
strategy = array.join(" ")    # "Initiate ultimate passing combo"

Symbols

Un symbol es una serie de caracteres o bytes asociados con un número único (ID) en Ruby. Los symbols son inmutables, lo que significa que solo una copia de un symbol necesita ser creada ya que siempre referencia al mismo objecto en el mismo espacio de memoria, por lo que son eficientes en el uso de espacio.

Creación:

:my_symbol
:another_symbol

Inmutabilidad:

Los symbols no pueden modificarse una vez creados y siempre retornan el mismo object_id:

a = :hello
b = :hello
a.object_id == b.object_id # true
:001 > :hello.object_id
=> 1266588
:002 > :hello.object_id
=> 1266588

Uso Interno:

Ruby asocia un número ID a cada symbol. Este ID es más eficiente de manejar en comparación con las cadenas de caracteres, especialmente cuando se utilizan repetidamente los mismos valores como claves en hashes o identificadores de métodos.

Intercambiabilidad con Strings:

Ruby permite que los symbols se utilicen en operaciones similares a las strings, pero convierte internamente los tipos según sea necesario. Esto puede llevar a impactos de rendimiento si se realiza la conversión frecuentemente.

Comparación con Strings:

Los symbols son más eficientes cuando se utilizan como identificadores que no cambian, como claves de hashes o nombres de métodos. Las strings, al ser mutables, son más adecuadas para manejar y manipular datos textuales.

Cuándo usar cada Uno

Usar Symbols:

Usar Strings:

Ejemplos

Symbols como identificadores:

def switch(value)
  case value
  when :foo
    # foo
  when :bar
    # bar
  when :baz
    # baz
  end
end

Strings para datos textuales:

def append_to(value)
  value.gsub(/foo/, 'bar')
end

Comprender las diferencias entre strings y symbols en Ruby es crucial para escribir código eficiente y claro. Utilizar symbols para identificadores constantes y strings para datos mutables y textuales ayuda a optimizar el rendimiento y la claridad del código.