Continuando os estudos de Ruby, e a leitura do livro The Ruby Programming Language
Hoje vamos continuar falando de Range, é hora de nos aprofundar.
Teste Associação em um intervalo
A classe Range define métodos para determinar se um valor arbitrário é um membro de (isto é, está incluído no) um Range. Antes de entrar em detalhes sobre estes métodos, é necessário explicar que associaçãoem range pode ser definido de duas maneiras diferentes que estão relacionadas com a diferença entre os intervalos contínuos e discretos. Um valor x é um membro do range entre begin..end pela primeira definição se:
1
|
|
E X é um membro do range begin…end (com três pontos), se:
1
|
|
Todos os valores de ponto de extremidade deve implementar o operador <=>, assim que esta definição de associação funciona para qualquer objeto Range e não requer um ponto final para implementar o método succ. Esse é o teste de associação contínua.
A segunda definição de filiação discreta independe succ. Ele trata um intervalo begin..end como um conjunto que inclui begin, begin.succ, begin.succ.succ, e assim por diante. Por esta definição, a associação do Range é ajustada a associação, e um valor de x está incluído numa range apenas se for um valor retornado por uma das invocações de succ. Observe que os testes de associação discreta é potencialmente uma operação muito mais cara do que os testes de associação contínua.
Com isso de fundo, podemos descrever os métodos de distribuição para testar a associação. Ruby 1.8 suporta dois métodos, include? e member?. Eles são sinônimos, e ambos usam a associação contínua, teste:
1 2 3 4 |
|
A situação é diferente no Ruby 1.9. Essa versão da linguagem introduz um novo método, cover?, que funciona como include? e member? do Ruby 1.8, ele sempre usa o teste de associação contínua. include? e member? ainda são sinônimos no Ruby 1.9. Se os pontos finais do intervalo são números, estes métodos utilizam o teste de associação contínua, assim como eles fizeram no Ruby 1.8. Se os desfechos não são numéricas, no entanto, eles ao invés de usar o teste de associação discreta. Podemos ilustrar estas mudanças com um Range discreto de Srintgs (você pode querer usar ri entender como String.succ funciona):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
1 2 3 4 5 |
|
Na prática, a maioria dos Ranges têm pontos de extremidade numéricos, e o Range de mudanças na API entre Ruby 1.8 e 1.9 têm pouco impacto.
É isso ai, até a proxima… :D
E bons estudos..