Se as instruções não introduzirem escopo no Ruby 1.9, qual é a lógica por trás dessa mudança do ruby 1.8?
Se as instruções não introduzirem escopo no Ruby 1.9, qual é a lógica por trás dessa mudança do ruby 1.8?
Duas razões pelas quais isso foi feito no Ruby 1.9 estão nos slides a seguir, embora possa não ser óbvio sem a caixa de diálogo do apresentador. Duas coisas que as if
instruções no scope permitem que você faça é definir no código-fonte coisas que podem ser acessadas fora da instrução if.
Primeiro exemplo: substituir métodos
class Employee
if String.method_defined?(:encode)
def name
...
end
else
def name
...
end
end
end
Neste exemplo, existem duas definições diferentes para o name
método Um que será usado se o String.encode
método existir e um (implementação inferior) que será usado se o método de codificação não existir. Essencialmente, isso permite que você use uma string codificada corretamente se as bibliotecas suportarem.
Segundo exemplo: Substituir implementação
if String.method_defined?(:encode)
module Builder
...
end
else
class String
...
end
end
Neste exemplo, estamos fornecendo uma classe / módulo completamente diferente, dependendo da existência de um recurso de biblioteca. Isso permite que você tenha um algoritmo completamente diferente que use um novo recurso de biblioteca e, ao mesmo tempo, retorne a um algoritmo menos eficiente ou completo que esteja próximo o suficiente se ele não existir.
O tudo importante porque
Então, o que isso te compra? Se a if
declaração introduzisse um novo escopo, o novo método ou classe existiria apenas e seria usado dentro dos limites da if
declaração. Essa restrição dificulta muito o suporte a uma biblioteca que precisará de alterações para o Ruby 2.0 à medida que migrarmos da versão 1.9 no futuro.
Com os dois exemplos fornecidos na apresentação à qual você vinculou, o raciocínio é manter uma base de código para suas bibliotecas enquanto ainda suporta várias versões do Ruby. Eu acredito que nasceu da dor da transição entre Ruby 1.8 e Ruby 1.9. Como a equipe do Ruby está avançando constantemente para a 2.0, você ainda poderá oferecer suporte aos usuários quando houver alterações incompatíveis. Eu acredito que houve alguns entre 1.9.1 e 1.9.2. Haverá mais no futuro.
Não sou especialista, mas se você der uma olhada nas Perguntas frequentes sobre Ruby aqui: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Seção 2.3 "Quando uma variável local se torna acessível?" mostra o comportamento atual.
Para contornar o problema do escopo, uma das coisas um pouco "hacky" que você precisa fazer atualmente é:
É recomendável colocar uma declaração de atribuição como a = nil antes de acessar uma variável local para não se incomodar com esse comportamento das variáveis locais.
Eu acredito que 1,9 irá remover a necessidade de fazer isso, e isso pode ser um dos drivers para o novo comportamento.