Почему, если заявления не вводят область действия в ruby ​​1.9?

Ответы:

9

Две причины, почему это было сделано в Ruby 1.9, приведены на следующих слайдах, хотя это может быть неочевидно без диалога докладчика. Две вещи, которые ifпозволяют делать операторы no scope , - это определять вещи в исходном коде, к которым можно получить доступ вне оператора if.

Первый пример: заменить методы

class Employee
  if String.method_defined?(:encode)
    def name
      ...
    end
  else
    def name
      ...
    end
  end
end

В этом примере имеются два различных определения для nameметода. Один, который будет использоваться, если String.encodeметод существует, и один (низшая реализация), который будет использоваться, если метод кодирования не существует. По сути, это позволяет вам использовать правильно закодированную строку, если библиотеки поддерживают ее.

Второй пример: заменить реализацию

if String.method_defined?(:encode)
  module Builder
    ...
  end
else
  class String
    ...
  end
end

В этом примере мы предоставляем совершенно другой класс / модуль в зависимости от того, существует ли функция библиотеки. Это позволяет вам иметь совершенно другой алгоритм, который использует новую библиотечную функцию, в то же время возвращаясь к менее эффективному или полному алгоритму, который достаточно близок, если он не существует.

Все важно почему

Так что это покупает тебя? Если ifоператор вводит новую область видимости, новый метод или класс будут существовать и использоваться только в пределах ifоператора. Из-за этого ограничения очень трудно поддерживать библиотеку, которая будет нуждаться в изменениях для Ruby 2.0, поскольку в будущем мы перейдем от 1.9.

С обоими примерами, представленными в презентации, на которую вы ссылаетесь, обоснование состоит в том, чтобы поддерживать одну кодовую базу для ваших библиотек, в то же время поддерживая несколько версий Ruby. Я полагаю, что это произошло от боли перехода между Ruby 1.8 и Ruby 1.9. Поскольку команда Ruby неуклонно движется к версии 2.0, вы все равно сможете поддерживать своих пользователей в случае несовместимых изменений. Я полагаю, что между 1.9.1 и 1.9.2 были некоторые. Там будет больше в будущем.

Берин Лорич
источник
1

Я не эксперт, но если вы посмотрите на FAQ по Ruby здесь: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php

Раздел 2.3 «Когда становится доступной локальная переменная?» показывает текущее поведение.

Чтобы обойти проблему с областью видимости, одна из слегка «хакерских» вещей, которые вам сейчас нужно сделать, это:

Рекомендуется поместить оператор присваивания как a = nil перед доступом к локальной переменной, чтобы не беспокоить такое поведение локальных переменных.

Я считаю, что 1.9 избавит от необходимости делать это, и это может быть одним из драйверов для нового поведения.

Paddyslacker
источник