Em Ruby, uma linguagem de programação dinâmica e orientada a objetos, as strings, ou “cadeias de caracteres”, desempenham um papel fundamental. Elas são sequências de caracteres colocados entre aspas simples ou duplas. As aspas duplas permitem interpolação de variáveis e caracteres de escape, enquanto as aspas simples não permitem. Por exemplo:
rubynome = "João"
puts "Olá, #{nome}!" # Saída: Olá, João!
Aqui, #{nome}
é uma interpolação de variável dentro da string.
Além disso, as strings em Ruby são objetos e, portanto, têm métodos associados a elas. Por exemplo:
rubyfrase = "Ruby é uma linguagem de programação poderosa"
puts frase.length # Saída: 42
O método length
retorna o comprimento da string.
Os arrays, ou “matrizes”, são coleções ordenadas de objetos. Em Ruby, eles podem conter objetos de diferentes tipos. Por exemplo:
rubynumeros = [1, 2, 3, 4, 5]
nomes = ["Ana", "Pedro", "Maria"]
Os arrays em Ruby são indexados a partir de zero, o que significa que o primeiro elemento está no índice 0. Eles também têm uma variedade de métodos úteis, como push
, pop
, shift
, unshift
, include?
, entre outros.
rubynumeros.push(6) # Adiciona 6 ao final do array
nomes.pop # Remove o último elemento do array
Os hashes, ou “tabelas hash”, são estruturas de dados que armazenam pares de chave-valor. Cada chave é única em um hash. Por exemplo:
rubypessoa = { "nome" => "Carlos", "idade" => 30, "profissão" => "engenheiro" }
Para acessar os valores de um hash, podemos usar suas chaves:
rubyputs pessoa["nome"] # Saída: Carlos
puts pessoa["idade"] # Saída: 30
Além disso, os hashes em Ruby possuem uma sintaxe alternativa usando símbolos como chaves:
rubypessoa = { nome: "Carlos", idade: 30, profissao: "engenheiro" }
puts pessoa[:nome] # Saída: Carlos
Os símbolos são objetos imutáveis e únicos usados como identificadores em Ruby.
As variáveis em Ruby são tipadas dinamicamente, o que significa que o tipo de uma variável é determinado em tempo de execução. Por exemplo:
rubyx = 10 # x é um inteiro
x = "Olá" # x é uma string
Ruby usa o conceito de “duck typing”, que se concentra nos métodos que um objeto pode responder, em vez de seu tipo real.
As constantes em Ruby começam com uma letra maiúscula e por convenção são escritas em letras maiúsculas. Uma vez atribuído um valor a uma constante, esse valor não pode ser alterado. Por exemplo:
rubyPI = 3.14159
Em Ruby, as variáveis de instância começam com um sinal de @
e são usadas para atributos de objetos. Elas existem apenas para a instância específica do objeto. Por exemplo:
rubyclass Pessoa
def initialize(nome)
@nome = nome
end
end
pessoa1 = Pessoa.new("Ana")
pessoa2 = Pessoa.new("Pedro")
Cada instância da classe Pessoa
terá seu próprio valor para @nome
.
As variáveis de classe começam com @@
e são compartilhadas entre todas as instâncias de uma classe e suas subclasses. Por exemplo:
rubyclass Carro
@@total_carros = 0
def initialize
@@total_carros += 1
end
def self.total_carros
@@total_carros
end
end
carro1 = Carro.new
carro2 = Carro.new
puts Carro.total_carros # Saída: 2
Aqui, @@total_carros
é uma variável de classe que mantém o controle do número total de instâncias da classe Carro
.
Em suma, em Ruby, as strings, arrays e hashes são estruturas de dados fundamentais. As variáveis podem ser tipadas dinamicamente e existem vários tipos de variáveis, incluindo locais, de instância e de classe. O uso adequado dessas estruturas e variáveis é essencial para escrever código Ruby eficiente e legível.
“Mais Informações”
Claro, vamos aprofundar um pouco mais!
Em Ruby, além das estruturas de dados mencionadas anteriormente, existem também os símbolos, que são objetos imutáveis usados como identificadores. Eles são frequentemente usados como chaves em hashes devido à sua eficiência e clareza. Por exemplo:
rubyhash = { :nome => "João", :idade => 25 }
No entanto, Ruby oferece uma sintaxe mais concisa para criar hashes usando símbolos como chaves:
rubyhash = { nome: "João", idade: 25 }
Esta sintaxe é frequentemente preferida por ser mais legível e menos verbosa.
Além disso, em Ruby, é possível iterar sobre coleções usando iteradores como each
, map
, select
, entre outros. Por exemplo:
rubynomes = ["Ana", "Pedro", "Maria"]
nomes.each do |nome|
puts "Olá, #{nome}!"
end
Este código irá imprimir “Olá, Ana!”, “Olá, Pedro!” e “Olá, Maria!”.
Outro recurso poderoso em Ruby é a capacidade de definir métodos em qualquer lugar, incluindo dentro de outros métodos. Isso permite uma grande flexibilidade e modularidade no design de código. Por exemplo:
rubyclass Calculadora
def soma(a, b)
a + b
end
def multiplicacao(a, b)
a * b
end
end
calc = Calculadora.new
puts calc.soma(2, 3) # Saída: 5
puts calc.multiplicacao(2, 3) # Saída: 6
Aqui, soma
e multiplicacao
são métodos da classe Calculadora
.
Além disso, Ruby suporta herança de classes, permitindo que uma classe herde métodos e atributos de outra classe. Por exemplo:
rubyclass Animal
def falar
"Som genérico de animal"
end
end
class Cachorro < Animal
def falar
"Au au!"
end
end
animal = Animal.new
puts animal.falar # Saída: Som genérico de animal
cachorro = Cachorro.new
puts cachorro.falar # Saída: Au au!
Neste exemplo, a classe Cachorro
herda o método falar
da classe Animal
, mas o redefine para produzir um som específico de cachorro.
Além disso, Ruby suporta mixins, que são uma forma de reutilizar código em várias classes sem herança direta. Isso é feito usando o módulo include
. Por exemplo:
rubymodule Saudacao
def saudar
"Olá!"
end
end
class Pessoa
include Saudacao
end
class Animal
include Saudacao
end
pessoa = Pessoa.new
puts pessoa.saudar # Saída: Olá!
animal = Animal.new
puts animal.saudar # Saída: Olá!
Neste exemplo, tanto a classe Pessoa
quanto a classe Animal
incluem o módulo Saudacao
, permitindo que ambas tenham acesso ao método saudar
.
Em Ruby, também é possível definir getters e setters de forma conveniente usando os métodos attr_reader
, attr_writer
e attr_accessor
. Por exemplo:
rubyclass Pessoa
attr_reader :nome # Define um getter para o atributo @nome
def initialize(nome)
@nome = nome
end
end
pessoa = Pessoa.new("Ana")
puts pessoa.nome # Saída: Ana
Aqui, attr_reader :nome
define automaticamente um método nome
que retorna o valor do atributo @nome
.
Esses são apenas alguns dos recursos poderosos oferecidos pela linguagem Ruby. Sua sintaxe expressiva e flexibilidade tornam-na uma escolha popular para uma variedade de aplicativos, desde scripts simples até aplicativos da web complexos.