Mengapa jika pernyataan tidak memperkenalkan ruang lingkup di ruby ​​1.9?

Jawaban:

9

Dua alasan mengapa ini dilakukan di Ruby 1.9 ada di slide berikut, meskipun mungkin tidak jelas tanpa dialog presenter. Dua hal yang tidak ifdiizinkan 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 namemetode ini. Satu yang akan digunakan jika String.encodemetode 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 ifpernyataan memperkenalkan ruang lingkup baru, metode atau kelas baru hanya akan ada dan digunakan dalam batas-batas ifpernyataan. 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.

Berin Loritsch
sumber
1

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.

Paddyslacker
sumber