-
Notifications
You must be signed in to change notification settings - Fork 37
/
pt.yml
1477 lines (1473 loc) · 95.1 KB
/
pt.yml
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
head:
title: BetterDocs
metatags:
description: Programação fundamental com exemplos e referências em Rubi. Abrange
tópicos, princípios SOLID, padrões de design, estruturas de dados e algoritmos.
keywords: Documentos melhores, Ruby, Fundamentals, Fundamentos de programação
Ruby. Ruby gotchas, programação funcional, metaprogramação, threads, princípios
sólidos Ruby com exemplos, padrões de projeto Ruby com exemplos, algoritmos
Ruby com exemplos, estruturas de dados Ruby com exemplos.
content:
menu:
open: Abrir Menu
close: Fechar Menu
sidebar:
- title: Algoritmos
url: algorithms
submenus:
- key: sorting
submenus:
- bubble_sort
- insertion_sort
- selection_sort
- shell_sort
- heap_sort
- merge_sort
- quick_sort
- key: searching
submenus:
- binary_search
- knuth_moriss_pratt_search
- title: Estruturas de dados
url: data_structures
submenus:
- key: axioms
submenus:
- fetch_store
- elementary_operations ou funções elementares
- call_method ou método de chamada
- calculating
- object
- example
- key: implementations
submenus:
- stack
- queue ou fila
- deque
- singly_linked_list
- doubly_linked_list
- ordered_list
- hash_table
- binary_tree ou árvore binária
- binary_search_tree
- b_tree
- binary_heap
- title: Padrões de design
url: design_patterns
submenus:
- key: creational
submenus:
- abstract_factory
- builder ou construtor
- factory
- prototype
- singleton
- key: structural
submenus:
- adapter
- composite
- decorator
- facade
- flyweight
- proxy
- key: behavioral
submenus:
- chain_of_responsobility
- command
- interpreter
- iterator
- mediator
- observer
- state
- strategy
- template
- visitor
- title: Programação Funcional
url: functional_programming
submenus:
- pure_functions
- closures
- applying
- title: Gotchas
url: gotchas
submenus:
- surprising
- quotes
- twue
- symbols_and_strings
- string_or_nothing
- constants
- equals
- operations
- priority
- sensitive
- onto
- variables
- initialize
- superman
- regexp
- any
- undef
- freeze
- one_is_one
- bang
- array
- hash
- rescue
- to_str
- missing
- exception
- private
- braces
- module
- title: Questões de entrevista
url: interview_questions
- title: Meta Programação
url: meta_programming
submenus:
- dynamic_dispatch
- dynamic_method
- dynamic_proxies
- title: Princípios sólidos
url: solid_principles
submenus:
- single
- open_close
- liskov
- segregation
- di
- title: Torne-se Mestre em Ruby
url: ruby_meister
- title: Tópicos
url: threads
submenus:
- green
- gil
- mutex
- fibers
- rails
- config
pages:
wiki: Leia o wiki
credits: Créditos
page404:
title: Página não encontrada :(
description: A página solicitada não pôde ser encontrada.
page500:
title: "Something was going wrong :(" ou "Algo deu errado"
algorithms:
title: Algoritmos
complexity:
best: Melhor
average: Média
worst: Pior
sorting:
title: Classificação
description: Um algoritmo de classificação é um algoritmo que coloca elementos
de uma lista em uma determinada ordem. As ordens mais utilizadas são ordem numérica
e ordem lexicográfica. A classificação eficiente é importante para otimizar
o uso de outros algoritmos (como algoritmos de busca e mesclagem) que exigem
que os dados de entrada estejam nas listas classificadas; também é frequentemente
útil para canonizar dados e para produzir resultados legíveis por humanos.
bubble_sort:
title: Tipo de bolha
description: O tipo Bubble tem muitas das mesmas propriedades que o tipo de
inserção, mas tem uma sobrecarga ligeiramente maior. No caso de dados quase
ordenados, a ordenação de bolhas toma <span class="code-inline time">O(n)</span>
, mas requer pelo menos 2 passagens pelos dados (enquanto a ordenação de inserção
requer algo mais como 1 passagem).
insertion_sort:
title: Tipo de inserção
description: Embora seja um dos algoritmos de ordenação elementares com <span
class="code-inline">O(n<sup>2</sup>)</span> pior momento, a ordenação de
inserção é o algoritmo escolhido quando os dados são quase ordenados (porque
é adaptativo) ou quando o tamanho do problema é pequeno (porque tem baixa
sobrecarga). Por essas razões, e porque também é estável, a classificação
de inserção é frequentemente usada como o caso base recursivo (quando o tamanho
do problema é pequeno) para algoritmos de classificação de divisão e conquista
de sobrecarga superiores, como classificação por mesclagem ou classificação
rápida.
selection_sort:
title: Seleção de seleção
description: A partir da comparação apresentada aqui, pode-se concluir que a
classificação de seleção nunca deve ser usada. Ele não se adapta aos dados
de forma alguma (observe que as quatro animações acima são executadas em sincronia),
portanto, seu tempo de execução é sempre quadrático. No entanto, o tipo de
seleção tem a propriedade de minimizar o número de trocas. Em aplicações onde
o custo de troca de itens é alto, o tipo de seleção pode ser o algoritmo escolhido.
shell_sort:
title: Tipo de concha
description: A pior complexidade de tempo do tipo shell depende da sequência
de incremento. Para os incrementos 1 4 13 40 121 ..., que é o que é usado
aqui, a complexidade do tempo é <span class="code-inline">O(n<sup><sup>3</sup>
⁄<sub>2</sub></sup>)</span>. Para outros incrementos, a complexidade de
tempo é conhecida como <span class="code-inline">O(n<sup><sup>4</sup>⁄<sub>3</sub></sup>)</span>
e até <span class="code-inline">O(n·lg<sub>2</sub>(n))</span>
. Não são conhecidos limites superiores apertados na complexidade
do tempo nem a melhor sequência de incremento. Como o tipo de shell é baseado
em inserção, o tipo shell herda as propriedades adaptativas do tipo inserção.
A adaptação não é tão dramática porque a ordenação de shell requer uma passagem
pelos dados para cada incremento, mas é significativa. Para a sequência de
incremento mostrada acima, existem incrementos de <span class="code-inline">log
<sub>3</sub>(n)</span> , portanto a complexidade de tempo para dados quase
ordenados é <span class="code-inline">O(n·log<sub>3</sub>(n))</span>
. Devido à sua baixa sobrecarga, implementação relativamente simples, propriedades
adaptativas e complexidade de tempo sub-quadrática, a ordenação de shell pode
ser uma alternativa viável para os algoritmos de ordenação <span class="code-inline">O(n·log(n))</span>
para algumas aplicações quando os dados a serem ordenados são
não muito grande.
heap_sort:
title: Tipo de pilha
description: O Tipo de pilha é simples de implementar, executa uma ordenação no local
<span class="code-inline">O (n · lg (n))</span> , mas não é estável. O primeiro
loop, a fase heap <span class="code-inline">(n)</span> “heap”, coloca o array
em ordem de heap. O segundo loop, a fase <span class="code-inline">O (n ·
lg (n))</span> “sort down”, extrai repetidamente o máximo e restaura a ordem
de heap. A função sink é escrita recursivamente para maior clareza. Assim,
como mostrado, o código requer espaço <span class="code-inline">Θ (lg (n))</span>
para a pilha de chamadas recursivas. No entanto, a recursão de cauda no sink
() é facilmente convertida em iteração, o que produz o limite de espaço <span
class="code-inline">O (1)</span> . Ambas as fases são ligeiramente adaptativas,
embora não de maneira particularmente útil. No caso quase classificado, a
fase de heap destrói a ordem original. No caso invertido, a fase de heap é
o mais rápida possível, pois a matriz é iniciada na ordem de heap, mas a fase
de classificação é típica. No caso das poucas chaves exclusivas, há alguma
aceleração, mas não tanto quanto no tipo shell ou no quicksort de 3 vias.
merge_sort:
title: Mesclar ordenar
description: 'Mesclar ordenar é muito previsível. Faz comparações
entre <span class="code-inline">0.5lg(n)</span> e <span class="code-inline">lg
(n)</span> por elemento, e entre <span class="code-inline">lg(n)</span> e
<span class="code-inline">1.5lg(n)</span> swaps por elemento. Os mínimos
são obtidos para dados já ordenados; os máximos são obtidos, em média, para
dados aleatórios. Se usar <span class="code-inline">Θ(n)</span> espaço extra
não é uma preocupação, então Mesclar ordenar é uma excelente escolha: é simples
de implementar, e é o único algoritmo de ordenação <span class="code-inline">O
(n·lg(n))</span> estável. Observe que, ao classificar listas vinculadas,
a mesclagem requer apenas <span class="code-inline">Θ(lg(n)</span> espaço
extra (para recursão). A mesclagem é o algoritmo escolhido para uma variedade
de situações: quando a estabilidade é necessária, ao classificar listas vinculadas
e quando o acesso é muito mais caro que o acesso seqüencial (por exemplo,
classificação externa em fita). Existem algoritmos de mesclagem de tempo linear
no local para a última etapa do algoritmo, mas eles são caros e complexos.
A complexidade é justificada para aplicativos como classificação externa quando
<span class="code-inline">Θ(n)</span> espaço extra não está disponível.'
quick_sort:
title: Ordenação rápida
description: Quando implementado com cuidado, o quicksort é robusto e tem pouca
sobrecarga. Quando uma classificação estável não é necessária, o quicksort
é uma excelente classificação de propósito geral - embora a versão de particionamento
de 3 vias sempre deva ser usada em seu lugar. O código de particionamento
bidirecional mostrado acima foi escrito para maior clareza em vez de desempenho
ideal; exibe localidade pobre e, criticamente, exibe o tempo <span class="code-inline">O
(n <sup>2</sup> )</span> quando há poucas chaves exclusivas. Um método de
particionamento bidirecional mais eficiente e robusto é fornecido no Quicksort
is Optimal por Robert Sedgewick e Jon Bentley. O particionamento robusto produz
recursão balanceada quando há muitos valores iguais ao pivô, produzindo garantias
probabilísticas de tempo <span class="code-inline">O (n · lg (n))</span> e
espaço <span class="code-inline">O (lg (n))</span> para todas as entradas.
Com ambas as subtarefas executadas recursivamente, a ordenação rápida requer
<span class="code-inline">O (n)</span> espaço extra para a pilha de recursão
no pior caso, quando a recursão não é balanceada. É muito improvável que isso
ocorra, mas pode ser evitado classificando primeiro a sub-matriz menor recursivamente;
o segundo tipo de sub-array é uma chamada recursiva final, que pode ser feita
com iteração. Com essa otimização, o algoritmo usa o espaço extra <span class="code-inline">O
(lg (n))</span> no pior dos casos.
other: Outros algoritmos de ordenação
additional: Leitura adicional
searching:
title: Procurando
binary_search:
title: Pesquisa binária
description: Na ciência da computação, a pesquisa binária, também conhecida
como pesquisa de meio intervalo ou pesquisa logarítmica, é um algoritmo de
pesquisa que localiza a posição de um valor de destino dentro de uma matriz
classificada. Ele compara o valor de destino com o elemento do meio da matriz;
se forem desiguais, a metade na qual o alvo não pode mentir é eliminada e
a busca continua na metade restante até que seja bem-sucedida.
knuth_moriss_pratt_search:
title: Pesquisa Knuth-Morris-Pratt
description: Em ciência da computação, o algoritmo de busca de strings Knuth
– Morris – Pratt (ou algoritmo KMP) procura por ocorrências de uma “palavra”
W dentro de uma “cadeia de texto” S empregando a observação de que quando
uma incompatibilidade ocorre, a própria palavra incorpora informações para
determinar onde a próxima partida poderia começar, evitando assim o reexame
de caracteres previamente correspondidos.
other:
title: Outros algoritmos de pesquisa
dijkstra: Algoritmo de Dijkstra
kruskal: Algoritmo de Kruskal
longest: Maior subsequência crescente
telephone_number: Número de telefone para palavras
credits: 'Código e artigos foram retirados dos recursos:'
data_structures:
title: Estruturas de dados
description: Na ciência da computação, a notação O grande é usada para classificar
os algoritmos pela maneira como eles respondem às mudanças no tamanho da entrada,
por exemplo, como o tempo de processamento de um algoritmo muda à medida que o
tamanho do problema se torna extremamente grande. Na teoria dos números analíticos,
ele é usado para estimar o "erro cometido" ao substituir o tamanho assintótico
de uma função aritmética pelo valor que assume em um grande argumento finito.
Um exemplo famoso é o problema de estimar o termo restante no teorema do número
primo.
axioms:
title: Axiomas básicos de estruturas de dados
description: O desempenho do tempo de execução do common language runtime é dado
por um conjunto de axiomas que agora devemos postular.
fetch_store:
title: Buscar e armazenar tempo
description1: O tempo necessário para buscar uma referência a um objeto da memória
é uma constante, <span class="code-inline">T_fetch</span> , e o tempo necessário
para armazenar uma referência a um objeto na memória é uma constante, <span
class="code-inline">T_store</span>
description2: De acordo com Axiom, a instrução de atribuição tem tempo de execução
<span class="code-inline">T_fetch + T_store</span> . Ou seja, o tempo gasto
para buscar a referência do objeto da variável x é <span class="code-inline">T_fetch</span>
e o tempo gasto para armazenar essa referência de objeto na variável y é <span
class="code-inline">T_store</span> .
description3: Também tem tempo de execução <span class="code-inline">T_fetch
+ T_store</span> . Para ver por que esse deve ser o caso, considere que a
constante <span class="code-inline">1</span> nomeia um objeto Fixnum com o
valor um. Portanto, podemos esperar que o custo de buscar a referência para
o objeto chamado 1 seja o mesmo que o de buscar uma referência para qualquer
outro objeto.
elementary_operations:
title: Tempo de operações aritméticas elementares
description1: Os tempos necessários para realizar operações aritméticas elementares,
como adição, subtração, multiplicação, divisão e comparação, são todos constantes.
Esses tempos são denotados por <span class="code-inline">T_ +, T_-, T_ /,
T_ *, T_ <,</span> respectivamente.
description2: Podemos determinar o tempo de uma instrução como <span class="code-inline">2
* T_fetch + T_ + + T_store</span> . Isso porque precisamos buscar duas referências
de objeto das variáveis y e 1; execute a adição dando um novo objeto cujo
valor é a soma; e, armazene uma referência ao novo objeto na variável y.
description3: Vamos supor que a alternativa exija exatamente o mesmo tempo de
execução que a declaração original.
call_method:
title: Hora do método de chamada
description1: O tempo necessário para chamar um método é uma constante, <span
class="code-inline">T_call</span> , e o tempo necessário para retornar de
um método é uma constante, <span class="code-inline">T_return</span> A justificativa
para fazer a sobrecarga associada ao parâmetro passar a mesma que a hora de
armazenar uma referência de objeto é que o A passagem de um argumento é conceitualmente
a mesma que a atribuição do valor real do parâmetro ao parâmetro formal do
método.
description2: De acordo com Axiom, o tempo de execução da instrução seria <span
class="code-inline">T_fetch + 2 * T_store + T_call + T_f (x)</span> , onde
<span class="code-inline">T_f (x)</span> é o tempo de execução do método f
para a entrada x. A primeira das duas lojas é devido à passagem do parâmetro
x para o método f; o segundo surge da atribuição para a variável y.
calculating:
title: Tempo de cálculo
description1: O tempo necessário para o cálculo do endereço implícito por uma
operação de assinatura de matriz, por exemplo, <span class="code-inline">a
[i]</span> , é uma constante, <span class="code-inline">T_ []</span> . Este
tempo não inclui o tempo para calcular a expressão subscrita, nem inclui o
tempo para acessar o elemento da matriz.
description2: 'Isso é <span class="code-inline">3 * T_fetch</span> . São necessárias
três buscas de operandos: a primeira para buscar uma referência ao objeto
de matriz a; o segundo para buscar uma referência ao objeto de índice i; e
o terceiro para buscar uma referência ao elemento da matriz <span class="code-inline">a
[i]</span> .'
object:
title: Hora de criação de objeto
description1: O tempo necessário para criar uma nova instância de objeto de
uma classe é uma constante, <span class="code-inline">T_new</span> . Desta
vez não inclui nenhum tempo para inicializar o objeto. Ao aplicar Axiomas,
podemos determinar o tempo de execução da instrução.
description2: <span class="code-inline">T_new + T_fetch + 2 * T_store + T_call
+ T_fixnum_init</span> , em que <span class="code-inline">T_fixnum_init</span>
é o tempo de execução do método initialize da classe Fixnum.
example:
title: Exemplo
description: Nesta seção, aplicamos Axiomas, a análise do tempo de execução
de um programa para calcular a seguinte soma de séries aritméticas simples.
implementations:
title: Implementação
stack:
title: Pilha
description: A pilha é o irmão da fila. Ele imita uma pilha real (por exemplo,
de papel). É FILO (first-in-last-out), de modo que quando os itens são recuperados
da pilha, eles são retornados no sentido inverso da ordem em que foram adicionados.
Mais uma vez, Ruby Arrays fornece um recipiente perfeito. Tal como acontece
com a fila, também poderia ser implementado usando uma lista vinculada.
as_array: Empilhar como matriz
as_linked_list: Empilhar como lista vinculada
queue:
title: Fila
description: Uma fila é uma estrutura simples baseada em contêiner que imita
uma fila real (por exemplo, espera na fila no banco). É FIFO (first-in-first-out),
o que significa que quando você recupera itens da fila, eles são retornados
na ordem em que foram inseridos. Ruby Arrays fornecem métodos que tornam a
implementação de fila trivialmente fácil, mas tê-los nomeados apropriadamente
e contidos em uma classe de conveniência vale a pena para ver que eles são
implementados e porque outras estruturas herdarão desta. Uma implementação
alternativa pode ser feita usando uma lista vinculada.
as_array: Fila como matriz
as_linked_list: Fila como lista vinculada
deque:
title: e
description: Um Deque é uma fila que permite adicionar e remover itens em ambas
as extremidades.
as_array: E como uma matriz
as_linked_list: Deque como lista vinculada
singly_linked_list:
title: Lista unicamente vinculada
description: As listas unicamente ligadas contêm nós que possuem um campo de
dados, bem como um campo 'próximo', que aponta para o próximo nó na
linha de nós. As operações que podem ser realizadas em listas ligadas individualmente
incluem inserção, exclusão e passagem.
doubly_linked_list:
title: Lista encadeada dupla
description: Em uma lista duplamente vinculada, cada elemento da lista contém
duas referências - uma para seu sucessor e uma para seu predecessor.
ordered_list:
title: Lista ordenada
description: Uma lista ordenada é uma lista na qual a ordem dos itens é significativa.
No entanto, os itens em uma lista ordenada não são necessariamente classificados.
Consequentemente, é possível alterar a ordem dos itens e ainda ter uma lista
ordenada válida.
as_array: Lista ordenada como matriz
hash_table:
title: Tabela de Hash
description: Uma tabela de hash é um contêiner pesquisável. Como tal, ele fornece
métodos para colocar um objeto no contêiner, localizar um objeto no contêiner
e remover um objeto do contêiner.
binary_tree:
title: Árvore binária
description: Uma árvore binária é uma árvore na qual cada nó pode ter no máximo
dois filhos. As crianças são designadas à esquerda e à direita.
binary_search_tree:
title: Árvore de pesquisa binária
description: 'Na ciência da computação, as árvores de pesquisa binária (BST),
às vezes chamadas de árvores binárias ordenadas ou ordenadas, são um tipo
particular de contêineres: estruturas de dados que armazenam "itens"
(como números, nomes etc.) na memória. Eles permitem pesquisa rápida, adição
e remoção de itens e podem ser usados para implementar conjuntos dinâmicos
de itens ou tabelas de consulta que permitem localizar um item por sua chave
(por exemplo, encontrar o número de telefone de uma pessoa pelo nome)'
b_tree:
title: B-tree
description: Na ciência da computação, uma árvore B é uma estrutura de dados
de árvore de autoequilíbrio que mantém os dados classificados e permite pesquisas,
acesso seqüencial, inserções e exclusões em tempo logarítmico. A árvore B
é uma generalização de uma árvore de pesquisa binária em que um nó pode ter
mais de dois filhos (Ao contrário das árvores de pesquisa binária de auto-equilíbrio,
a árvore B é otimizada para sistemas que lêem e escrevem grandes blocos de
dados. As árvores são um bom exemplo de uma estrutura de dados para a memória
externa, comumente usada em bancos de dados e sistemas de arquivos.
binary_heap:
title: Pilha binária
description: Um heap binário é uma árvore binária completa ordenada por heap
que é implementada usando uma matriz. Em um heap, a menor chave é encontrada
na raiz e, como a raiz é sempre encontrada na primeira posição da matriz,
encontrar a menor chave é uma operação trivial em um heap binário.
credits: 'Código e artigos foram retirados dos recursos:'
source: Esta página contém o código Ruby do livro de "Estruturas de Dados
e Algoritmos com Padrões de Design Orientados a Objetos em Ruby" por Bruno
R. Preiss. Copyright (c) 2004 por Bruno R. Preiss, P.Eng. Todos os direitos
reservados.
design_patterns:
title: Padrões de design
creational:
title: Padrões Criacionais
description: Na engenharia de software, os padrões de design criativos são padrões
de design que lidam com mecanismos de criação de objetos, tentando criar objetos
de maneira adequada à situação. A forma básica de criação de objetos pode resultar
em problemas de design ou em complexidade adicional ao design. Padrões de design
criativos resolvem esse problema controlando de alguma forma a criação desse
objeto. Padrões de design criativos são compostos de duas idéias dominantes.
Uma é encapsular o conhecimento sobre quais classes concretas o sistema usa.
Outra é esconder como instâncias dessas classes concretas são criadas e combinadas.
abstract_factory:
title: Padrão de fábrica abstrata
description: O padrão de fábrica abstrata fornece uma maneira de encapsular
um grupo de fábricas individuais que têm um tema comum sem especificar suas
classes concretas. No uso normal, o software cliente cria uma implementação
concreta da fábrica abstrata e, em seguida, usa a interface genérica da fábrica
para criar os objetos concretos que fazem parte do tema. O cliente não sabe
(ou se importa) quais objetos concretos obtém de cada uma dessas fábricas
internas, pois usa apenas as interfaces genéricas de seus produtos. Esse padrão
separa os detalhes de implementação de um conjunto de objetos de seu uso geral
e depende da composição de objetos, já que a criação de objetos é implementada
em métodos expostos na interface de fábrica.
builder:
title: Padrão de construtor
description: O padrão de construtor é um padrão de design de software de criação
de objeto. Ao contrário do padrão de fábrica abstrata e do padrão de método
de fábrica cuja intenção é permitir o polimorfismo, a intenção do padrão de
construtor é encontrar uma solução para o antipadrão do construtor telescópico
[citação necessária]. O antipadrão do construtor telescópico ocorre quando
o aumento da combinação de parâmetros do construtor de objetos leva a uma
lista exponencial de construtores. Em vez de usar vários construtores, o padrão
de construtor usa outro objeto, um construtor, que recebe cada parâmetro de
inicialização passo a passo e, em seguida, retorna o objeto construído resultante
de uma só vez.
factory:
title: Padrão de fábrica
description: Na programação baseada em classe, o padrão de método de fábrica
é um padrão de criação que usa métodos de fábrica para lidar com o problema
de criar objetos sem precisar especificar a classe exata do objeto que será
criado. Isso é feito criando objetos chamando um método de fábrica - seja
especificado em uma interface e implementado por classes filhas ou implementado
em uma classe base e, opcionalmente, substituído por classes derivadas - em
vez de chamar um construtor.
prototype:
title: Padrão de protótipo
description: O padrão de protótipo é um padrão de criação ao longo das linhas
da fábrica. O truque com o protótipo é que você cria novos objetos copiando
um objeto mestre. Altere esse objeto mestre e todos os objetos subseqüentes
que você criar irão para a vida com uma cópia da alteração.
singleton:
title: Padrão singleton
description: Certifique-se de que uma classe tenha apenas uma instância e forneça
um ponto global de acesso a ela. Isso é útil quando exatamente um objeto é
necessário para coordenar ações no sistema. Às vezes, o conceito é generalizado
para sistemas que operam com mais eficiência quando existe apenas um objeto
ou que restringem a instanciação a um determinado número de objetos.
not_covered:
title: 'Padrões não cobertos:'
lazy: Inicialização Preguiçosa
multiton: Multiton
pool: Pool de objetos
resource: Aquisição de recurso é inicialização
structural:
title: Padrões Estruturais
description: Na engenharia de software, os padrões de design estrutural são padrões
de design que facilitam o design, identificando uma maneira simples de realizar
relacionamentos entre entidades.
adapter:
title: Padrão adaptador
description: Na engenharia de software, o padrão do adaptador é um padrão de
design de software que permite que a interface de uma classe existente seja
usada como outra interface. Geralmente é usado para fazer com que as classes
existentes trabalhem com outras pessoas sem modificar seu código-fonte.
composite:
title: Padrão composto
description: O padrão de design composto é um padrão estrutural usado para representar
objetos que possuem uma estrutura de árvore hierárquica. Permite o tratamento
uniforme de nós de folhas individuais e de ramos compostos de muitos nós.
decorator:
title: Padrão decorador
description: Na programação orientada a objetos, o padrão decorador (também
conhecido como Wrapper, uma nomenclatura alternativa compartilhada com o padrão
Adaptador) é um padrão de projeto que permite que o comportamento seja adicionado
a um objeto individual, estaticamente ou dinamicamente, sem afetar o comportamento
de outros objetos. objetos da mesma classe. O padrão de decorador é geralmente
útil para aderir ao Princípio de Responsabilidade Única, pois permite que
a funcionalidade seja dividida entre classes com áreas únicas de interesse.
facade:
title: Padrão de fachada
description: O padrão de design Fachada é usado frequentemente quando um sistema
é muito complexo ou difícil de entender porque o sistema possui um grande
número de classes interdependentes ou seu código-fonte não está disponível.
Esse padrão esconde as complexidades do sistema maior e fornece uma interface
mais simples para o cliente. Geralmente, envolve uma única classe de wrapper
que contém um conjunto de membros requeridos pelo cliente. Esses membros acessam
o sistema em nome do cliente de fachada e ocultam os detalhes da implementação.
flyweight:
title: Padrão de peso
description: Na programação de computadores, o flyweight é um padrão de design
de software. Um flyweight é um objeto que minimiza o uso da memória compartilhando
tantos dados quanto possível com outros objetos semelhantes; é uma maneira
de usar objetos em grandes números quando uma representação repetida simples
usaria uma quantidade inaceitável de memória. Frequentemente, algumas partes
do estado do objeto podem ser compartilhadas, e é prática comum mantê-las
em estruturas de dados externas e passá-las aos objetos flyweight temporariamente
quando elas são usadas.
proxy:
title: Padrão de proxy
description: 'Um proxy, em sua forma mais geral, é uma classe que funciona como
uma interface para outra coisa. O proxy pode interagir com qualquer coisa:
uma conexão de rede, um objeto grande na memória, um arquivo ou algum outro
recurso que seja caro ou impossível de duplicar. Em resumo, um proxy é um
wrapper ou objeto de agente que está sendo chamado pelo cliente para acessar
o objeto de serviço real nos bastidores. O uso do proxy pode simplesmente
ser encaminhado para o objeto real ou fornecer lógica adicional. No proxy,
a funcionalidade extra pode ser fornecida, por exemplo, o armazenamento em
cache quando as operações no objeto real exigem muitos recursos ou a verificação
de condições prévias antes que as operações no objeto real sejam invocadas.
Para o cliente, o uso de um objeto proxy é semelhante ao uso do objeto real,
porque ambos implementam a mesma interface.'
protection_proxy:
title: Proxy de proteção
description: Proxy de proteção. Você está trabalhando em uma multinacional?
Se assim for, podemos estar bem cientes do servidor proxy que nos fornece
internet, restringindo o acesso a algum tipo de sites, como e-mail público,
redes sociais, armazenamento de dados, etc A gestão considera que, é melhor
bloquear algum conteúdo e fornecer apenas páginas da web relacionadas ao trabalho.
O servidor proxy faz esse trabalho. Este é um tipo de padrão de design de
proxy
virtual_proxy:
title: Proxy virtual
description: Proxy virtual. No lugar de um objeto complexo ou pesado, use uma
representação de esqueleto. Quando uma imagem subjacente é enorme em tamanho,
basta representá-la usando um objeto proxy virtual e, sob demanda, carregar
o objeto real. Você sabe que o objeto real é caro em termos de instanciação
e, portanto, sem a necessidade real, não vamos usar o objeto real. Até que
surja a necessidade, usaremos o proxy virtual.
remote_proxy:
title: Proxy remoto
description: Proxy remoto. Na comunicação de objeto distribuído, um objeto local
representa um objeto remoto (um que pertence a um espaço de endereço diferente).
O objeto local é um proxy para o objeto remoto e a chamada de método no objeto
local resulta na invocação remota de método no objeto remoto. Pense em uma
implementação de ATM, ele manterá objetos proxy para informações bancárias
que existem no servidor remoto.
not_covered:
title: 'Padrões não cobertos:'
callback: Retorno de Chamada Anotado
bridge: Ponte
data_bus: Barramento de dados
role: Objeto de Função
behavioral:
title: Padrões comportamentais
description: Na engenharia de software, os padrões de design comportamental são
padrões de design que identificam padrões comuns de comunicação entre objetos
e realizam esses padrões. Ao fazer isso, esses padrões aumentam a flexibilidade
na execução dessa comunicação.
chain_of_responsobility:
title: Padrão de cadeia de responsabilidade
description: No design orientado a objetos, o padrão de cadeia de responsabilidade
é um padrão de design que consiste em uma fonte de objetos de comando e uma
série de objetos de processamento. Cada objeto de processamento contém lógica
que define os tipos de objetos de comando que ele pode manipular; o restante
é passado para o próximo objeto de processamento na cadeia. Também existe
um mecanismo para adicionar novos objetos de processamento ao final dessa
cadeia.
command:
title: Padrão de comando
description: O padrão de comando é um padrão de design de comportamento usado
para armazenar as informações necessárias para chamar métodos em um horário
futuro. O comando é meramente um conjunto de ações envolvidas em um objeto.
Com o ruby, podemos usar o Procs para fazer a mesma coisa sem a necessidade
de criar um objeto separado. Esta é uma boa opção quando a ação é simples
e não requer salvar informações de estado, caso contrário, uma classe de comando
é a melhor opção.
interpreter:
title: Padrão intérprete
description: Na programação de computadores, o padrão do interpretador é um
padrão de design que especifica como avaliar frases em um idioma. A idéia
básica é ter uma classe para cada símbolo (terminal ou não terminal) em uma
linguagem de computador especializada. A árvore de sintaxe de uma sentença
na linguagem é uma instância do padrão composto e é usada para avaliar (interpretar)
a sentença de um cliente.
iterator:
title: Padrão de iterador
description: O padrão de design do iterador fornece acesso sequencial a elementos
dentro de um contêiner sem expor como o contêiner realmente representa os
elementos. O iterador pode ser considerado como um ponteiro móvel que permite
acesso a elementos encapsulados em um contêiner.
external_iterator:
title: Padrão do iterador externo
description: 'Iterador Externo: A lógica de iteração está contida em uma classe
separada. A classe de iteração pode ser generalizada para manipular vários
tipos de objetos, desde que eles permitam a indexação. É necessário que a
classe adicional faça a iteração real, mas elas permitem maior flexibilidade
porque você pode controlar a iteração, quais elementos são iterados e em que
ordem.'
internal_iterator:
title: Padrão do iterador interno
description: 'Iterador interno: toda a lógica iterativa ocorre dentro do objeto
agregado. Use um bloco de código para passar sua lógica para o agregado que
chama o bloco para cada um de seus elementos.'
mediator:
title: Padrão de mediador
description: Normalmente, um programa é composto por um grande número de classes.
Portanto, a lógica e a computação são distribuídas entre essas classes. No
entanto, quanto mais classes são desenvolvidas em um programa, especialmente
durante a manutenção e / ou refatoração, o problema de comunicação entre essas
classes pode se tornar mais complexo. Isso dificulta a leitura e a manutenção
do programa. Além disso, pode tornar-se difícil alterar o programa, uma vez
que qualquer alteração pode afetar o código em várias outras classes. Com
o padrão de mediador, a comunicação entre objetos é encapsulada com um objeto
mediador. Os objetos não mais se comunicam diretamente entre si, mas se comunicam
através do mediador. Isso reduz as dependências entre objetos de comunicação,
diminuindo assim o acoplamento.
momento:
title: Momento do padrão
description: 'O padrão de momento é implementado com três objetos: o originador,
um zelador e um momento. O originador é algum objeto que possui um estado
interno. O zelador vai fazer algo ao originador, mas quer ser capaz de desfazer
a mudança. O zelador primeiro pergunta ao originador por um objeto do momento.
Então ele faz qualquer operação (ou sequência de operações) que faria. Para
reverter para o estado antes das operações, ele retorna o objeto momento para
o originador. O objeto do momento em si é um objeto opaco (aquele que o zelador
não pode ou não deve mudar). Ao usar esse padrão, deve-se tomar cuidado se
o originador puder alterar outros objetos ou recursos - o padrão de momento
opera em um único objeto.'
observer:
title: Padrão observador
description: O padrão observador é um padrão de design de software no qual um
objeto, chamado de sujeito, mantém uma lista de seus dependentes, chamados
observadores, e os notifica automaticamente de quaisquer mudanças de estado,
geralmente chamando um de seus métodos. É usado principalmente para implementar
sistemas distribuídos de manipulação de eventos. O padrão Observer também
é uma parte fundamental no padrão arquitetural familiar modelo-view – controller
(MVC). O padrão observador é implementado em várias bibliotecas e sistemas
de programação, incluindo quase todos os kits de ferramentas GUI.
state:
title: Padrão de estado
description: O padrão de estado é um padrão de design de software comportamental
que implementa uma máquina de estado de uma maneira orientada a objetos. Com
o padrão de estado, uma máquina de estado é implementada implementando cada
estado individual como uma classe derivada da interface de padrão de estado
e implementando transições de estado invocando métodos definidos pela superclasse
do padrão.
strategy:
title: Padrão de estratégia
description: A estratégia permite que o algoritmo varie independentemente dos
clientes que o usam. A estratégia é um dos padrões incluídos no influente
livro Design Patterns de Gamma et al. que popularizou o conceito de usar padrões
para descrever o design de software. Por exemplo, uma classe que executa a
validação nos dados recebidos pode usar um padrão de estratégia para selecionar
um algoritmo de validação com base no tipo de dados, na fonte dos dados, na
escolha do usuário ou em outros fatores discriminantes. Esses fatores não
são conhecidos para cada caso até o tempo de execução e podem exigir uma validação
radicalmente diferente a ser executada. As estratégias de validação, encapsuladas
separadamente do objeto de validação, podem ser usadas por outros objetos
de validação em diferentes áreas do sistema (ou mesmo sistemas diferentes)
sem duplicação de código.
template:
title: Padrão de método de modelo
description: Na programação orientada a objetos, primeiro é criada uma classe
que fornece as etapas básicas de um projeto de algoritmo. Essas etapas são
implementadas usando métodos abstratos. Mais tarde, as subclasses alteram
os métodos abstratos para implementar ações reais. Assim, o algoritmo geral
é salvo em um lugar, mas as etapas concretas podem ser alteradas pelas subclasses.
visitor:
title: Padrão visitante
description: Na programação orientada a objetos e na engenharia de software,
o padrão de design do visitante é uma maneira de separar um algoritmo de uma
estrutura de objeto na qual ele opera. Um resultado prático dessa separação
é a capacidade de adicionar novas operações a estruturas de objetos existentes
sem modificar essas estruturas. É uma maneira de seguir o princípio aberto
/ fechado. Em essência, o visitante permite adicionar novas funções virtuais
a uma família de classes sem modificar as próprias classes; em vez disso,
cria-se uma classe de visitante que implementa todas as especializações apropriadas
da função virtual. O visitante toma a referência da instância como entrada
e implementa a meta por meio do despacho duplo.
not_covered:
title: 'Padrões não cobertos:'
hierarchical: Visitante hierárquico
credits: 'Código e artigos foram retirados dos recursos:'
functional_programming:
title: Programação funcional
description: 'Usar uma linguagem em um estilo funcional implica que você tenha acesso
a alguns dos principais recursos listados abaixo:'
axioms:
immutable: 'Valores imutáveis: quando uma variável é definida, ela não pode ser
alterada. Em Ruby, isso significa que você efetivamente precisa tratar variáveis
como constantes.'
side_effects: 'Sem efeitos colaterais: quando passado um determinado valor, uma
função deve sempre retornar o mesmo resultado. Isso anda de mãos dadas com valores
imutáveis; uma função nunca pode pegar um valor e alterá-lo, pois isso estaria
causando um efeito colateral que é tangencial para retornar um resultado.'
pure_functions: 'Funções de ordem superior: são funções que permitem funções como
argumentos ou usam funções como valor de retorno. Esta é, sem dúvida, uma das
características mais críticas de qualquer linguagem funcional.'
applying: 'Currying: habilitado por funções de ordem superior, o currying está
transformando uma função que leva vários argumentos para uma função que recebe
um argumento. Isso anda de mãos dadas com o aplicativo de função parcial, que
está transformando uma função multi-argumento em uma função que usa menos argumentos
do que originalmente.'
recursion: 'Recursão: loop chamando uma função de dentro de si. Quando você não
tem acesso a dados mutáveis, a recursão é usada para construir e encadear a
construção de dados. Isso ocorre porque o loop não é um conceito funcional,
pois requer que as variáveis sejam passadas para armazenar o estado do loop
em um determinado momento.'
lazy: 'Avaliação preguiçosa ou avaliação atrasada: atrasando o processamento de
valores até o momento em que é realmente necessário. Se, por exemplo, você tiver
algum código que gerou uma lista de números de Fibonacci com a avaliação lenta
ativada, isso não seria realmente processado e calculado até que um dos valores
no resultado fosse requerido por outra função, como puts.'
pure_functions:
title: Funções puras
description: Você pode ver que esta função calcula o resultado usando apenas seus
argumentos.
closures:
title: Fechamentos
description: O Lambda também aplica um fechamento e, portanto, é capaz de manter
o contexto entre os objetos.
applying:
title: Aplicação parcial e transportando
description: Vamos primeiro entender o que essas duas aplicações diferentes de
funções são. A aplicação da função parcial está chamando uma função com algum
número de argumentos, para obter uma função que leve menos argumentos. O currying
está tomando uma função que pega n argumentos e divide-os em n funções que recebem
um argumento.
proc: Para lhe dar uma idéia mais clara do que cada uma dessas duas coisas fará
uma função, vamos pegar um exemplo Proc.
partial: A aplicação parcial desta função retornaria, se nós passássemos nos dois
primeiros argumentos, os seguintes procs aninhados.
curry: <span class="code-inline">.curry</span> retorna um proc curry. Se o argumento
de aridade opcional é dado, ele determina o número de argumentos. Um curry proc
recebe alguns argumentos. Se um número suficiente de argumentos for fornecido,
ele passará os argumentos fornecidos para o proc original e retornará o resultado.
Caso contrário, retorna outro proc curried que leva o resto dos argumentos.
gotchas:
title: Gotchas
description1: A maioria dos iniciantes no Ruby on Rails se empolga com o framework
e começa a criar aplicativos sem nenhum conhecimento do idioma. E essa é a magia
do RoR.
description2: Em algum momento as coisas começam a ficar sérias. Alguns demoram
tempo e esforço para explorar segredos sujos do Ruby on Rails, enquanto outros
encobrem e tornam-se desenvolvedores seniores com quase zero de conhecimento da
linguagem.
description3: De qualquer forma, mais cedo ou mais tarde, iniciantes ou programadores
experientes, todos nós nos deparamos com os chamados Ruby Gotchas - aquelas pequenas
sutilezas de linguagem que se escondem do nosso site por horas de depuração hardcore.
description4: Aqui está uma lista de pegadinhas populares e curiosidades em que
os desenvolvedores devem estar cientes. Para cada caso, há um exemplo de código
confuso e / ou propenso a erros.
description5: Eles vêm junto com boas práticas, que o impedirão de cometer erros
simples (mas difíceis de encontrar) e simplificar a sua vida (e do seu mantenedor
de código).
surprising:
title: Rubi pode ser surpreendente
description: Embora "projetado para maximizar a felicidade do programador",
com o "princípio da menor surpresa", Ruby ainda tem dicas. Esta apresentação
irá proceder das pegadinhas triviais dos novatos, para os mais avançados e confusos.
quotes:
title: Não me cite sobre isso, mas ...
description: Interpolação de String (incluindo caracteres especiais como <span
class="code-inline">\ n)</span> falha com citações <span class="code-inline">'single'</span>
- requer aspas <span class="code-inline">"duplas".</span> Assim como
na maioria das linguagens com interpolação de strings. Para evitar isso, use
o dobro sempre que possível.
twue:
title: É twue! É twue!
description: 'Apenas duas coisas são falsas: <span class="code-inline">false</span>e <span class="code-inline">nil</span>.
Tudo o resto é verdadeiro, mesmo
<span class="code-inline">0</span> (falso em C), <span class="code-inline">""</span>
(falso em JS), <span class="code-inline">[]</span> , etc. Tropeça em pessoas
de C, JS, etc., onde algumas delas são falsas.'
symbols_and_strings:
title: Pendure-o na efígie ou amarre-o simbolicamente.
description: '<span class="code-inline">Simbol != String</span> . Mesmo se o
mesmo for impresso. Lembre-se de qual usar para args. O ideal é pegar um deles
e usar o que um método espera: "Seja liberal naquilo que você aceita e
conservador no que você envia". Lei de Postel.'
string_or_nothing:
title: Corda ... ou nada!
constants:
title: Constantes não são
description: Maiúscula inicial significa constante, em Ruby. Tente mudar uma constante.
Ooooh você recebe um aviso! BFD. Mesmo o congelamento não funciona para Fixnums.
Ele funciona para matrizes (mais ou menos) e para a maioria dos outros objetos
... ele disse prefigurando.
equals:
title: Alguns são mais iguais que outros
description: <span class="code-inline">==</span> é o mesmo valor usual, <span
class="code-inline">.eql?</span> é valor e classe (1 é Fixnum, 1.0 é Float),
<span class="code-inline">.equal?</span> é o mesmo objeto. Na verdade, é muito
mais cabeludo.
operations:
title: "> ===! = ==!"
description: <span class="code-inline">===</span> é "igualdade de caso",
como nas declarações de caso. Um nome melhor pode ser <span class="code-inline">.describe?</span>
ou sobrecarga <span class="code-inline">.includes?</span>. Mais uma vez, é realmente
muito mais cabeludo; veja os documentos na classe Object. Obtém pessoas de idiomas
em que <span class="code-inline">===</span> é a identidade do objeto ou o mesmo
valor e classe.
priority:
title: e! = &&, ou! = ||
description: '<span class="code-inline">&&</span> tem precedência mais
alta que <span class="code-inline">=</span>, então <span class="code-inline">x
= true && false</span> significa <span class="code-inline">x = (true
&& false)</span> e tem precedência mais baixa, então <span class="code-inline">x
= true and false</span> significa <span class="code-inline">(x = true) and false</span>
. Guia de Estilo Ruby: Use <span class="code-inline">&&, ||</span> para
expressões booleanas <span class="code-inline">and, or</span> para fluxo de controle.'
sensitive:
title: Não seja tão sensível!
description: Espaços em branco insensíveis? NEM SEMPRE! Parser acha que é uma
expressão, como um arg, mas <span class="code-inline">(1, 2)</span> não é uma
expressão válida do Ruby! (Tudo funciona bem com 1 argumento).
usage: 'Com vários argumentos: <br/> - Sem parentes, sem problema. <br/> Pais
sem espaço, OK. <br/> - Parênteses e espaço, NÃO!'
methods: '<span class="code-inline">method / num</span> é uma regex ou string
não finalizada! Ruby acha que você está argumentando sobre o método. Princípio
geral: usar espaço em branco balanceado; ambos os lados ou nenhum dos dois.'
arguments: '<span class="code-inline">Um -2</span> faz o Ruby pensar que você
está dando um argumento <span class="code-inline">-2</span> para o método um.
O mesmo para <span class="code-inline">+2</span> ou até mesmo <span class="code-inline">*
2</span> . Novamente: use espaços em branco BALANCED, ambos os lados ou nenhum
dos dois.'
stubby: ""Stabby" lambdas (1.9+) Parênteses opcionais Espaço antes depois
de args sem pais, OK. Espaço depois dos pais, OK. Mais uma vez, espaço antes
dos pais, NÃO! ATUALIZAÇÃO: Corrigido em 2.0!"
onto:
title: O yer @ para!
description: 'Valor nu se torna uma variável local temporária! Solução: lembre-se
do <span class="code-inline">@!</span> (Ou "self". Ou use <span class="code-inline">attr_writer,
attr_accessor</span> .) Obtém pessoas do Java / C ++, não tanto do Python (que
também precisa do "self"). "Você continua usando essa variável.
Eu não acho que isso significa o que você acha que significa". Não Inigo
Montoya.'
variables:
title: Cuidado, é um @@!
description: Olha o que o preenchimento do espaço em branco? Nós não alteramos
o <span class="code-inline">valor @@</span> do Parent antes de verificá-lo,
nem o Child's! Ou nós? <span class="code-inline">@@ variáveis</span> são
compartilhadas com subclasses - não apenas que elas existem, mas as variáveis
em si! Declarando o <span class="code-inline">valor @@</span> do Child alterado,
incluindo o Child's.ut alterado do Parent, é um @@!
initialize:
title: Com init (ialize) ou sem ele
description: A inicialização do pai é executada automaticamente quando um filho
não possui nenhum. Além disso, os pais devem ser chamados para correr.
superman:
title: Super-homem contra o homem invisível
description: '<span class="code-inline">super</span> com a lista no-arg envia
o que chamador ficou <span class="code-inline">super</span> com args explícitos
envia esses argumentos para enviar argumentos NO, use parens vazios: <span class="code-inline">super
()</span> .'
regexp:
title: Quando isso vai acabar? (Ou começar?)
description: 'Em regexps padrão: <span class="code-inlne">^</span> é start e <span
class="code-inline">$</span> é o final de toda a string. Ruby regexes padrão
para multilinha, então: <span class="code-inline">^</span> é iniciar e <span
class="code-inline">$</span> é o fim de qualquer linha! <span class="code-inline">\
A</span> é start e <span class="code-inline">\ Z</span> é o final da string
inteira. (Ou \ z para incluir qualquer nova linha… que é outra pegadinha!)'
any:
title: recebendo .qualquer
description: '<span class="code-inline">.any?</span> não significa "algum
elemento"! Com bloco: "qualquer um faz o bloco verdadeiro?".
Sem: "há alguma verdade?" Tem bloco implícito: <span class="code-inline">{ |element| element }</span>.'
undef:
title: "(Des) Def Leppard"
description: Variáveis declaradas em blocos passados para iteradores (por exemplo,
times ou each) são indefinidos no topo de cada iteração! Os iteradores chamam
o bloco repetidamente, portanto, as variáveis ficam fora do escopo novamente
após cada chamada. Construções de loop incorporadas (por exemplo, while ou for)
são OK. (Ou declare vars antes do bloco.)
freeze:
title: Congelar (Ar) ray
description: Congelar uma matriz (ou um hash) congela, não os itens nela contidos.
As cordas podem ser modificadas no lugar. Dessa forma, você pode modificar um
determinado slot em uma Array of Strings congelada.
one_is_one:
title: 1 é 1… e cada vez mais será assim!
description: 'Alterar o Fixnum para um novo valor significa um novo objeto. Eles
não podem ser modificados no lugar! Portanto, não é possível modificar uma matriz
congelada de fixos. (Fixnums e Integers não possuem métodos bang para demonstrar
com o uso). BTW: o <span class="code-inline">object_id</span> um Fixnum é
o <span class="code-inline">value * 2 + 1</span>'
bang:
title: "(para! ||! para!) ==?"
description: O Bang marca o método como perigoso. Por quê? Muitas vezes, pode
modificar receptor, vs não modificado versão não-bang. NÃO CONFIE NELES QUE RETORNAM
O MESMO VALOR COMO VERSÃO NÃO BANG! Muitos retornam nulo se nenhuma mudança
for necessária!
array:
title: Uma matriz de novas armadilhas
description: O valor padrão dado como objeto é o mesmo objeto para cada slot!
Mutação de um muta padrão para todos. O valor inicial dado como bloco é avaliado
separadamente para cada slot. Use isso para criar novos vars para cada um.
hash:
title: Fazendo um Hash dele
description: 'Principalmente o mesmo problema (e solução) que Arrays. MORE GOTCHAS:
cria um novo objeto em qualquer acesso ao slot vazio! Pode criar um número excessivo
de novos objetos; ruínas verificando conteúdo "real" ou contagem (verificação
nula, tamanho, etc.).'
rescue:
title: Resgate-me, jogue uma linha, eu vou tentar pegá-lo!
description: Em Ruby, jogar e pegar não são para exceções! Eles são avançados
controle de fluxo, para sair do assentamento profundo. Ruby usa raise e rescue
para exceções.
to_str:
title: to_s VS to_str
description: '<span class="code-inline">to_s</span> é definido em cada objeto
e sempre retornará algo. <span class="code-inline">to_str</span> é definido
apenas em objetos que são semelhantes a strings. Por exemplo, <span class="code-inline">Symbol</span>
tem <span class="code-inline">to_str</span> mas <span class="code-inline">Array</span>
não. Assim, você pode usar <span class="code-inline">obj.respond_to?(:to_str)
em</span> vez de algo como <span class="code-inline">obj.is_a?(String)</span>
se quiser tirar vantagem da tipagem de pato sem se preocupar se a classe com
a qual você está trabalhando é uma subclasse de <span class="code-inline">String</span>
ou não.'
missing:
title: Precisa coordenar method_missing e respond_to_missing?
description: 'Ao substituir <span class="code-inline">method_missing</span> ,
lembre-se de substituir <span class="code-inline">response_to_missing?</span>
também. Quando você usa method_missing para fazer com que um objeto retorne
algo em uma chamada de método, sempre certifique-se de também redefinir respond_to_missing