nếu các tuyên bố không giới thiệu phạm vi trong Ruby 1.9, lý do đằng sau sự thay đổi này từ ruby 1.8 là gì?
nếu các tuyên bố không giới thiệu phạm vi trong Ruby 1.9, lý do đằng sau sự thay đổi này từ ruby 1.8 là gì?
Câu trả lời:
Hai lý do tại sao điều này được thực hiện trong Ruby 1.9 nằm trên các trang trình bày sau, mặc dù có thể không rõ ràng nếu không có hộp thoại của người trình bày. Hai điều mà không có if
câu lệnh phạm vi nào cho phép bạn làm là xác định những thứ trong mã nguồn của bạn có thể được truy cập bên ngoài câu lệnh if.
Ví dụ đầu tiên: Thay thế các phương thức
class Employee
if String.method_defined?(:encode)
def name
...
end
else
def name
...
end
end
end
Trong ví dụ này, có hai định nghĩa khác nhau cho name
phương thức. Một String.encode
phương thức sẽ được sử dụng nếu phương thức tồn tại và một phương thức (thực hiện kém hơn) sẽ được sử dụng nếu phương thức mã hóa không tồn tại. Về cơ bản, điều này cho phép bạn sử dụng một chuỗi được mã hóa chính xác nếu các thư viện hỗ trợ nó.
Ví dụ thứ hai: Thay thế thực hiện
if String.method_defined?(:encode)
module Builder
...
end
else
class String
...
end
end
Trong ví dụ này, chúng tôi đang cung cấp một lớp / mô-đun hoàn toàn khác nhau tùy thuộc vào việc có tồn tại tính năng thư viện hay không. Điều này cho phép bạn có một thuật toán hoàn toàn khác sử dụng tính năng thư viện mới trong khi vẫn quay trở lại thuật toán kém hiệu quả hoặc hoàn chỉnh, đủ gần nếu nó không tồn tại.
Tất cả quan trọng tại sao
Vì vậy, cái này mua gì cho bạn? Nếu if
câu lệnh giới thiệu một phạm vi mới, phương thức hoặc lớp mới sẽ chỉ tồn tại và được sử dụng trong giới hạn của if
câu lệnh. Hạn chế đó khiến cho việc hỗ trợ thư viện sẽ cần thay đổi cho Ruby 2.0 rất khó khăn khi chúng tôi di chuyển khỏi 1.9 trong tương lai.
Với cả hai ví dụ được cung cấp trong bản trình bày mà bạn liên kết đến, lý do là để duy trì một cơ sở mã cho các thư viện của bạn trong khi vẫn hỗ trợ nhiều phiên bản của Ruby. Tôi tin rằng nó được sinh ra từ nỗi đau khi chuyển đổi giữa Ruby 1.8 và Ruby 1.9. Vì nhóm Ruby đang dần tiến tới 2.0, bạn vẫn có thể hỗ trợ người dùng của mình khi có những thay đổi không tương thích. Tôi tin rằng có một số từ 1.9.1 đến 1.9.2. Sẽ có nhiều hơn trong tương lai.
Tôi không phải là chuyên gia, nhưng nếu bạn xem Câu hỏi thường gặp về Ruby tại đây: http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
Mục 2.3 "Khi nào một biến cục bộ có thể truy cập được?" cho thấy hành vi hiện tại.
Để giải quyết vấn đề phạm vi, một trong những điều hơi "hack" mà bạn hiện phải làm là:
Bạn nên đặt một câu lệnh gán như a = nil trước khi truy cập một biến cục bộ để không bị làm phiền bởi hành vi như vậy của các biến cục bộ.
Tôi tin rằng 1.9 sẽ loại bỏ sự cần thiết phải làm điều này và đây có thể là một trong những trình điều khiển cho hành vi mới.