Чому якщо заяви не вводять сферу застосування в рубін 1.9?


Відповіді:


9

Дві причини, чому це було зроблено в Ruby 1.9, знаходяться на наступних слайдах, хоча це не може бути очевидним без діалогу ведучого. Дві речі, які не ifдозволяють вам зробити операторами сфери , - це визначити речі у вихідному коді, до яких можна отримати доступ поза оператором 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 усуне необхідність цього робити, і це може бути одним із рушій для нової поведінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.