Por que se as instruções não introduzem escopo no ruby ​​1.9?


Respostas:


9

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 ifinstruçõ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 namemétodo Um que será usado se o String.encodemé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 ifdeclaração introduzisse um novo escopo, o novo método ou classe existiria apenas e seria usado dentro dos limites da ifdeclaraçã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.


1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.