Hoje vamos continuar falando de Ruby, é hora de nos aprofundar falando um pouco de Variáveis não inicializadas
Invocações de método
Uma expressão de invocação de método tem quatro partes:
Uma expressão arbitrária cujo valor é o objeto no qual o método é chamado. Esta expressão é seguido por . ou :: para separá-lo a partir do nome do método que se segue. A expressão e o separador são opcionais; se omitido, o método é invocada em si mesmo.
O nome do método a ser invocado. Este é o único pedaço exigido de uma expressão chamada de método.
Valores com o argumento passado para o método. A lista de argumentos podem ser colocados entre parênteses, mas estes são geralmente opcionais. Se há mais de um argumento, eles são separados uns dos outros com vírgulas. O número e tipo de argumentos necessários dependem da definição do método. Alguns métodos podem ser chamodos sem argumentos.
Um bloco opcional de código delimitado por chaves ou por um par
do/end
. O método pode invocar esse código usando a palavra-chave deyield
. Esta capacidade de associar código arbitrário com qualquer invocação de método é a base para métodos poderosos em Ruby.
Um nome do método é normalmente separado do objeto sobre o qual é chamado com um ..
, e com o ::
, que também é permitido, mas é raramente
usado porque pode fazer invocações de método parecem mais com referênciar constantes expressões.
Quando o interpretador Ruby tem o nome de um método e um objeto em que deve ser invocado, ele encontra a definição adequada do método chamado usando um processo conhecido como “método de pesquisa” ou “resolução de nome do método.” Os detalhes não são importantes aqui, mas eles são explicados completamente no método de pesquisa.
O valor de uma invocação expressão de método é o valor da expressão avaliada pelo último método no corpo do código. Aqui, no entanto, são alguns exemplos de invocações de método:
1 2 3 4 |
|
Um dos exemplos do método de invocação mostradas anteriormente foi message.length
. Você pode ser tentado a pensar-lo como uma variável
de expressão de referência, avaliando para o valor do comprimento da variável do objeto mensage. Este não é o caso, no entanto, Ruby tem
um modelo de programação muito orientada a objetos: objetos em Ruby podem encapsular qualquer número de variáveis de instância interna,
mas expõem métodos apenas para o mundo exterior. Como o método length
não espera argumentos e é chamado sem os parênteses opcionais,
parece que referência uma variável. Na verdade, isso é intencional. Métodos como estes são chamados para atribuir métodos de acesso, e
dizemos que o objeto da mensage
tem um atributo de lenght
. Como veremos, é possível que o objeto de mensage
para definir um método chamado length=
. Se este método espera um único argumento, então é um método setter do atributo e
Ruby invoca em resposta a atribuição. Se um tal método é definido, então estas duas linhas de código seria tanto chamar o mesmo método:
1 2 |
|
Agora, considere a seguinte linha de código, assumindo que uma variável contém um Array
:
1
|
|
Você pode pensar novamente que este é um tipo especial de variável de referência, onde a variável em questão é na verdade um elemento do
Array
. Novamente, no entanto, esta é invocação do método. O intérprete Ruby converte o acesso ao Array
para isso:
1
|
|
O acesso ao Array
torna-se uma invocação do método chamado []
, com o índice do Array
como seu
argumento. Esta sintaxe de acesso de Array
não se limita a Arrays
. Qualquer objeto é permitido para definir um
método chamado []
. Quando o objeto é “indexado”, com o indix entre parênteses, os valores dentro dos parênteses será passado
para o método. Se o método []
é escrito para esperar três argumentos, então você deve colocar três expressões separados por
vírgula dentro dos colchetes.
Atribuição de Arrays
também é feito através de invocação de método. Se o objeto o define um método chamado []=
, então a expressão o[x] = y
torna-se o.[] = (x, y)
, e a expressão o[x, y] = z
se torna o.[] = (x , y, z)
.
Muitos operadores do Ruby são definidos como métodos, e expressões como x + y
são avaliados como x.+(y)
, onde o
nome de método é +
. O fato de que muitos dos operadores do Ruby são definidos como métodos que significa você pode redefinir
esses operadores na sua próprias classes.
Agora, vamos considerar esta expressão muito simples:
1
|
|
Se uma variável x nomeada existe (Isto é, se o interpretador Ruby tem visto uma atribuição a x), então esta é uma variável de referência. Se nenhuma variável existe, então esta é uma invocação do método x, sem argumentos.
A palavra super
em Ruby é um tipo especial de invocação de método. Esta palavra é usada ao criar uma subclasse de outra
classe. Por si só, super
passa os argumentos do método corrente para o método com o mesmo nome na superclasse. Ele também
pode ser usado como se fosse realmente o nome de um método e pode ser seguido por uma lista de argumentos arbitrários. A palavra-chave
super
é abordada em detalhes no Aumentando Comportamento por encadeamento.
Até a Proxima… :)