Если операторы не вводят область действия в Ruby 1.9, в чем смысл этого изменения по сравнению с ruby 1.8?
Если операторы не вводят область действия в Ruby 1.9, в чем смысл этого изменения по сравнению с ruby 1.8?
Ответы:
Две причины, почему это было сделано в 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 были некоторые. Там будет больше в будущем.
Я не эксперт, но если вы посмотрите на FAQ по Ruby здесь: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Раздел 2.3 «Когда становится доступной локальная переменная?» показывает текущее поведение.
Чтобы обойти проблему с областью видимости, одна из слегка «хакерских» вещей, которые вам сейчас нужно сделать, это:
Рекомендуется поместить оператор присваивания как a = nil перед доступом к локальной переменной, чтобы не беспокоить такое поведение локальных переменных.
Я считаю, что 1.9 избавит от необходимости делать это, и это может быть одним из драйверов для нового поведения.