quarta-feira, 8 de abril de 2009

Usando um Dicionário com objeto

Como podemos colocar valores e funções dentro de um Dicionário, você pode
usa-lo como um objeto.

Vamos usar um Dicionário para traduzir para qualquer linguagem que se deseje.

Primeiro defina um objeto (isto é, um Dicionário) que tem a função de tradução,
mas nenhum para palavra para traduzir.
:let transdict = {}
:function transdict.translate(line) dict
: return join(map(split(a:line), 'get(self.words, v:val, "???")'))
:endfunction
Esta função usa 'self.words' para procurar as traduções de palavras. Porém não
existe 'self.words'. Assim você poderia chama-la de classe abstrata.

Agora podemos instanciar um objeto tradutor para o holandês,'Dutch':
:let uk2nl = copy(transdict)
:let uk2nl.words = {'one': 'een', 'two': 'twee', 'three': 'drie'}
:echo uk2nl.translate('three one')
< drie een ~
E um objeto tradutor para o alemão, 'German':
:let uk2de = copy(transdict)
:let uk2de.words = {'one': 'ein', 'two': 'zwei', 'three': 'drei'}
:echo uk2de.translate('three one')
< drei ein ~
A função 'copy()' foi usada para fazer um cópia do dicionário 'transdict' ('a
classe abstrata') e então a cópia é alterada adicionando palavras. A versão
original permanece a mesma.

Agora podemos ser mais flexíveis usando seu tradutor preferido:
:if $LANG =~ "de"
: let trans = uk2de
:else
: let trans = uk2nl
:endif
:echo trans.translate('one two three')
< een twee drie ~
Aqui 'trans' refere a um dos dois objetos (Dicionários). Nenhuma cópia é feita.

Você poderia usar uma linguagem que não é suportada. Você pode sobrepor
'translate()' para não fazer nada.
:let uk2uk = copy(transdict)
:function! uk2uk.translate(line)
: return a:line
:endfunction
:echo uk2uk.translate('three one wladiwostok')
< three one wladiwostok ~
Note que '!' foi usada para regravar a referencia de função existente. Agora use
'uk2uk' quando nenhuma linguagem conhecida é encontrada:
:if $LANG =~ "de"
: let trans = uk2de
:elseif $LANG =~ "nl"
: let trans = uk2nl
:else
: let trans = uk2uk
:endif
:echo trans.translate('one two three')
< one two three ~

0 comentários:

Postar um comentário