Operador de resolução de escopo - Scope resolution operator
Na programação de computadores , o escopo é um contexto abrangente onde valores e expressões são associados. O operador de resolução de escopo ajuda a identificar e especificar o contexto ao qual um identificador se refere, especialmente especificando um namespace . Os usos específicos variam em diferentes linguagens de programação com as noções de escopo. Em muitos idiomas, o operador de resolução de escopo é escrito ::
.
Em algumas linguagens, notavelmente aquelas influenciadas por Modula-3 (incluindo Python e Go ), módulos são objetos , e a resolução de escopo dentro dos módulos é um caso especial de acesso de membro de objeto comum, então o operador de método usual .
é usado para resolução de escopo. Outras linguagens, notadamente C ++ e Ruby , apresentam resolução de escopo e acesso a métodos, que interagem de várias maneiras; veja os exemplos abaixo.
C ++
class A {
public:
static int i; // scope of A
};
namespace B {
int c = 2;
} // namespace B
int A::i = 4; // scope operator refers to the integer i declared in the class A
int x = B::c; // scope operator refers to the integer c declared in the namespace B
PHP
Em PHP , o operador de resolução de alcance também é chamado Paamayim Nekudotayim ( Hebrew : פעמיים נקודותיים , pronunciado [paʔamajim nekudotajim] , a segunda palavra de uma corrupção coloquial נקודתיים, pronunciado [nekudatajim] ), o que significa “duplo con ” em Hebrew.
O nome "Paamayim Nekudotayim" foi introduzido no Zend Engine 0.5 desenvolvido em Israel e usado no PHP 3 . Embora tenha sido confuso para muitos desenvolvedores que não falam hebraico, ele ainda está sendo usado no PHP 7, como neste exemplo de mensagem de erro:
$ php -r ::
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
Um erro semelhante também pode ocorrer onde nenhum operador de resolução de escopo está presente. Por exemplo, tentar verificar se uma constante é empty () aciona este erro:
$ php -r 'define("foo", "bar"); if (empty(foo)) echo "empty";'
Parse error: syntax error, unexpected ')', expecting T_PAAMAYIM_NEKUDOTAYIM
A partir do PHP 5.4, as mensagens de erro relacionadas ao operador de resolução de escopo ainda incluem esse nome, mas esclarecem um pouco seu significado:
$ php -r ::
Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)
Existem outras maneiras menos óbvias de acionar o erro, por exemplo, tentando usar a seguinte expressão PHP inválida:
$ php -r static const '$a=1'
Parse error: syntax error, unexpected end of file, expecting :: (T_PAAMAYIM_NEKUDOTAYIM)
Rubi
Em Ruby , a resolução de escopo pode ser especificada usando namespaces (como classes ou módulos).
module Example
Version = 1.0
class << self # We are accessing the module's singleton class
def hello(who = "world")
"Hello #{who}"
end
end
end #/Example
Example::hello # => "Hello world"
Example.hello "hacker" # => "Hello hacker"
Example::Version # => 1.0
Example.Version # NoMethodError
# This illustrates the difference between the message (.) operator and the scope operator in Ruby (::)
# We can use both ::hello and .hello, because hello is a part of Example's scope and because Example
# responds to the message hello.
#
# We can't do the same with ::Version and .Version, because Version is within the scope of Example, but
# Example can't respond to the message Version, since there is no method to respond with.
O escopo também é afetado por sigilos que precedem nomes de variáveis:
- "
$
" - variável global - "
@
" - variável de instância deself
- "
@@
" - variável de classe - Sem sigilo, minúsculas ou sublinhado - variável local ou método
- Sem sigilo, maiúsculas - constante