jika pernyataan tidak memperkenalkan ruang lingkup di Ruby 1.9, apa alasan di balik perubahan ini dari ruby 1.8?
jika pernyataan tidak memperkenalkan ruang lingkup di Ruby 1.9, apa alasan di balik perubahan ini dari ruby 1.8?
Dua alasan mengapa ini dilakukan di Ruby 1.9 ada di slide berikut, meskipun mungkin tidak jelas tanpa dialog presenter. Dua hal yang tidak if
diizinkan oleh pernyataan ruang lingkup adalah menentukan hal-hal dalam kode sumber Anda yang dapat diakses di luar pernyataan if.
Contoh pertama: Ganti metode
class Employee
if String.method_defined?(:encode)
def name
...
end
else
def name
...
end
end
end
Dalam contoh ini, ada dua definisi berbeda untuk name
metode ini. Satu yang akan digunakan jika String.encode
metode ada, dan satu (implementasi lebih rendah) yang akan digunakan jika metode pengkodean tidak ada. Pada dasarnya, ini memungkinkan Anda untuk menggunakan string yang disandikan dengan benar jika perpustakaan mendukungnya.
Contoh kedua: Ganti implementasi
if String.method_defined?(:encode)
module Builder
...
end
else
class String
...
end
end
Dalam contoh ini, kami menyediakan kelas / modul yang sama sekali berbeda tergantung pada apakah ada fitur perpustakaan. Ini memungkinkan Anda untuk memiliki algoritma yang sama sekali berbeda yang menggunakan fitur perpustakaan baru sambil tetap kembali ke algoritma yang kurang efisien atau lengkap yang cukup dekat jika tidak ada.
Yang terpenting kenapa
Jadi, apa ini membelikanmu? Jika if
pernyataan memperkenalkan ruang lingkup baru, metode atau kelas baru hanya akan ada dan digunakan dalam batas-batas if
pernyataan. Kendala itu membuatnya sangat sulit untuk mendukung perpustakaan yang akan membutuhkan perubahan untuk Ruby 2.0 saat kami bermigrasi dari 1.9 di masa mendatang.
Dengan kedua contoh yang disediakan dalam presentasi yang Anda tautkan, alasannya adalah mempertahankan satu basis kode untuk pustaka Anda sambil tetap mendukung beberapa versi Ruby. Saya percaya itu lahir dari rasa sakit transisi antara Ruby 1.8 dan Ruby 1.9. Karena tim Ruby terus bergerak menuju 2.0, Anda masih dapat mendukung pengguna Anda ketika ada perubahan yang tidak kompatibel. Saya percaya ada beberapa antara 1.9.1 dan 1.9.2. Akan ada lebih banyak di masa depan.
Saya bukan ahli, tetapi jika Anda melihat FAQ Ruby di sini: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Bagian 2.3 "Kapan variabel lokal dapat diakses?" menunjukkan perilaku saat ini.
Untuk mengatasi masalah pelingkupan, salah satu hal yang sedikit "retas" yang saat ini harus Anda lakukan adalah:
Anda disarankan untuk menempatkan pernyataan penugasan seperti = nil sebelum mengakses variabel lokal agar tidak terganggu oleh perilaku variabel lokal tersebut.
Saya percaya bahwa 1.9 akan menghapus kebutuhan untuk melakukan ini, dan ini mungkin salah satu pendorong untuk perilaku baru.