якщо заяви не вводять сферу застосування в Ruby 1.9, що обґрунтовує цю зміну в порівнянні з рубіном 1,8?
якщо заяви не вводять сферу застосування в Ruby 1.9, що обґрунтовує цю зміну в порівнянні з рубіном 1,8?
Відповіді:
Дві причини, чому це було зроблено в 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. У майбутньому їх буде більше.
Я не експерт, але якщо ви подивитесь на FAQ про Ruby тут: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Розділ 2.3 "Коли локальна змінна стає доступною?" показує поточну поведінку.
Щоб обійти проблему з визначенням масштабу, одна з дещо "химерних" речей, яку ви зараз маєте зробити, це:
Перед зверненням до локальної змінної рекомендується ставити оператор присвоєння типу a = nil, щоб не турбуватись така поведінка локальних змінних.
Я вважаю, що 1.9 усуне необхідність цього робити, і це може бути одним із рушій для нової поведінки.