Percursos
/
Ruby
Ruby
/
Programa
/
Intervalos
In

Intervalos em Ruby

1 exercício

Sobre Intervalos

Um intervalo representa o espaço entre dois valores. Os tipos mais comuns que suportam intervalos são Integer e String. Podem ser usados para muitas coisas, como criar rapidamente uma coleção, cortar strings, verificar se um valor está num intervalo e iterar. São criados com o operador de intervalo .. ou ... (inclusivo e exclusivo, respetivamente).

1..5  # => 1..5
1...5 # => 1...5

(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]

A razão para existirem dois operadores de intervalo é permitir criar intervalos que incluem ou excluem o valor final, o que pode ser útil, por exemplo, quando trabalhas com índices que começam em zero.

Os intervalos também podem ser criados com o inicializador Range.

Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Note

Quando crias um intervalo em Ruby com os operadores de intervalo .. ou ... e queres chamar um método ao intervalo, tens de envolver o intervalo em parênteses. Caso contrário, o método será chamado sobre o segundo argumento do operador de intervalo.

(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)

Obter substrings

Quando queres extrair parte de uma string, podes usar o operador de intervalo para obter uma substring. Ou seja, criando um intervalo com o índice inicial e final da substring.

"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"

Também podes usar índices negativos para obter a substring a partir do fim da string.

"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"

Métodos dos intervalos

Os intervalos têm um conjunto de métodos que podes usar para trabalhar com eles. Por exemplo, estes métodos permitem obter a soma de todos os valores do intervalo ou verificar se o intervalo inclui um valor.

Método Descrição Exemplo
sum Devolve a soma de todos os valores do intervalo (1..5).sum # => 15
size Devolve o tamanho do intervalo (1..5).size # => 5
include? Devolve true se o intervalo incluir o valor dado, caso contrário false (1..5).include?(3) # => true

Intervalos sem fim e sem início

Um intervalo pode ser sem fim ou sem início. Um intervalo sem fim ou sem início tem o valor inicial ou final definido como nil, mas, ao definir o intervalo, o nil pode ser omitido.

Usar intervalos sem início e sem fim é útil quando queres, por exemplo, cortar uma string a partir do início ou até ao fim.

"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Caution

Se não for usado numa coleção, o intervalo sem fim pode provocar uma sequência sem fim, se não for usado com cuidado.

Intervalos de strings

As strings também podem ser usadas em intervalos e permitem obter um intervalo de strings entre duas strings. O comportamento pode ser um pouco inesperado com certas strings, por isso usa-o com cuidado.

"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]

Objetos personalizados em intervalos

Advanced

O Ruby permite-te usar objetos personalizados em intervalos. Para isso, é preciso que o objeto implemente o seguinte:

  • inclua o módulo Comparable
  • o método succ
  • o método <=>

Estes métodos fazem com que o intervalo consiga iterar sobre o objeto e comparar os objetos no intervalo.

class Foo
  include Comparable

  attr_reader :value

  def initialize(value)
    @value = value
  end

  def succ
    Foo.new(value + 1)
  end

  def <=>(other)
    value <=> other.value
  end
end

(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>
Editar via GitHub A ligação abre numa nova janela ou separador

Aprende Intervalos