Trilhas
/
Ruby
Ruby
/
Programa
/
Intervalos
In

Intervalos em Ruby

1 exercício

Sobre Intervalos

Ranges representam um intervalo entre dois valores. Os tipos mais comuns que suportam ranges são Integer e String. Eles podem ser usados para muitas coisas, como criar uma coleção rapidamente, fatiar strings, verificar se um valor está em um range e iterar. Eles são criados usando o operador de range .. ou ... (inclusivo e exclusivo, respectivamente).

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]

O motivo de existirem dois operadores de range é permitir criar ranges que incluem ou excluem o valor final, o que pode ser útil, por exemplo, ao trabalhar com índices que começam em zero.

Ranges também podem ser criados usando o inicializador Range.

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

Ao criar um range em Ruby usando os operadores de range .. ou ... e querer chamar um método nele, você precisa envolver o range entre parênteses. Isso acontece porque, caso contrário, o método será chamado no segundo argumento do operador de range.

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

Obtendo substrings

Quando você quer fatiar uma string, pode usar o operador de range para obter uma substring. Ou seja, criando um range com os índices inicial e final da substring.

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

Você também pode 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 de range

Ranges têm um conjunto de métodos que podem ser usados para trabalhar com eles. Por exemplo, esses métodos podem ser usados para obter a soma de todos os valores do range ou verificar se o range inclui um valor.

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

Ranges sem fim e sem início

Um range pode ser sem fim e sem início. Em um range sem fim ou sem início, o valor inicial ou final é nil, mas ao definir o range o nil pode ser omitido.

Usar ranges sem início e sem fim é útil quando você quer, por exemplo, fatiar uma string do começo ou até o fim.

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

Se não for usado em uma coleção, o range sem fim pode causar uma sequência sem fim, caso não seja usado com cautela.

Ranges de strings

Strings também podem ser usadas em ranges e permitem obter um intervalo de strings entre duas strings. O comportamento pode ser um pouco inesperado ao usar certas strings, então use com cautela.

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

Objetos personalizados em ranges

Advanced

O Ruby permite usar objetos personalizados em ranges. O requisito para isso é que o objeto implemente o seguinte:

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

Esses métodos fazem com que o range possa iterar sobre o objeto e comparar os objetos no range.

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 O link abre em uma nova janela ou aba

Aprenda Intervalos