Phạm vi là một khái niệm quan trọng cần hiểu đối với tất cả các nhà phát triển Ruby.
Tại sao?
Bởi vì nó là nguồn gốc của nhiều thông báo lỗi và nhầm lẫn.
Phạm vi là gì?
Phạm vi đề cập đến những biến nào có sẵn tại bất kỳ thời điểm nhất định nào.
Các loại biến khác nhau có phạm vi khác nhau.
Phạm vi có thể rất hẹp (biến cục bộ) hoặc rất rộng (biến toàn cục) .
Bạn muốn sử dụng phạm vi hẹp nhất có thể để tránh các vấn đề về đột biến trạng thái và xung đột tên.
Sau đây là danh sách ví dụ về cách phạm vi ảnh hưởng đến mã Ruby của bạn.
Phạm vi biến cục bộ
Biến cục bộ có phạm vi hẹp nhất.
Cụ thể, các biến cục bộ được xác định bên trong các phương thức sẽ không còn tồn tại sau khi phương thức trả về.
Đây là một ví dụ :
a = 50 def apple a = 100 puts a end
Bạn nghĩ gì apple
sẽ in?
Đây là câu trả lời :
Khi bạn gọi apple
nó sẽ luôn in 100
.
Thực tế là a
được định nghĩa bên ngoài phương pháp dưới dạng 50
không có bất kỳ tác động nào đến a
biến bên trong phương thức .
Chúng là các biến khác nhau.
Bạn có thể coi phạm vi như một cục xà phòng …
a = 50
đầu tiên này nằm trong một bong bóng, sau đó khi bạn gọi một phương thức, BẤT KỲ phương thức nào, bạn nhập một bong bóng EMPTY mới.
Bạn không đưa bất kỳ biến cục bộ nào lên bong bóng mới.
Và khi phương thức kết thúc…
Bong bóng bật lên.
Các biến bên trong bong bóng biến mất và bạn không thể truy cập chúng.
Đó là cách hoạt động của các biến cục bộ.
Phạm vi biến trường hợp
Các biến phiên bản có phạm vi rộng hơn.
Cụ thể, chúng được sử dụng để chia sẻ dữ liệu bên trong một đối tượng Ruby.
Đây là một ví dụ :
class Fruit def more_juice @quantity = 100 end def less_juice @quantity = 50 end end
Trong ví dụ này, @quantity
là cùng một biến cho cả more_juice
&less_juice
phương pháp.
Đó là giá trị được chia sẻ giữa các phương pháp.
Nhưng bên ngoài lớp này và thậm chí trên các Fruit
khác đối tượng, @quantity
sẽ khác.
Ví dụ :
orange = Fruit.new apple = Fruit.new orange.more_juice apple.less_juice
Mỗi đối tượng đều có tập hợp các biến phiên bản của riêng nó.
Vì vậy, trong ví dụ này, orange
sẽ có @quantity
trong tổng số 100 và apple
sẽ có @quantity
trong tổng số 50.
Giống như những người khác nhau có tên, tuổi, quốc gia khác nhau, v.v.
Phạm vi hoạt động như thế nào trong các khối
Các khối rất thú vị khi nói đến phạm vi.
Nếu chúng ta làm theo phép tương tự bong bóng của mình một lần nữa, những gì một khối thực hiện là mang lại các biến cục bộ từ bong bóng hiện tại .
Bạn có thể truy cập và thay đổi chúng.
Ví dụ :
a = [] 3.times { a << 1 } p a # [1, 1, 1]
NHƯNG ...
Bong bóng vẫn bật lên, xóa mọi biến cục bộ MỚI được tạo bên trong khối.
Điều đó thật thú vị phải không?
Đây là ví dụ về ý tôi muốn nói :
1.times { b = [1,2,3] } b # NameError
Không chỉ vậy, các khối cũng sẽ mang theo bong bóng tại thời điểm chúng được tạo.
Một hiệu ứng được gọi là "đóng cửa" .
Hãy nhớ rằng "bong bóng" này là tập hợp của tất cả các biến có thể được truy cập tại một điểm cụ thể trong mã nguồn.
Đó là phạm vi chính nó, được đóng gói như một đối tượng.
Chúng tôi gọi đây là Binding
trong Ruby.
Cách sử dụng Ruby Bindings
Một khái niệm nữa mà tôi muốn chia sẻ với bạn trong bài viết này là về các ràng buộc.
Bạn có thể lưu tất cả các bong bóng mà chúng ta đã nói đến trong một đối tượng Ruby, một đối tượng của Binding
lớp học.
Ví dụ :
def banana a = 100 binding end banana.class # Binding
Đối tượng liên kết này là bong bóng.
Bạn thậm chí có thể nhìn vào bong bóng và xem có gì trong đó.
Ví dụ :
banana.send(:local_variables) # [:a]
Còn về Rails Scopes?
Phạm vi trong Rails khác với phạm vi trong Ruby.
Vậy, phạm vi trong Rails là gì?
Đó là một cách để đặt tên cho một truy vấn cơ sở dữ liệu tùy chỉnh, bao gồm ActiveRecord
phương pháp.
Đây là một ví dụ :
class User < ApplicationRecord scope(:with_email) { where.not(email: nil) } end User.with_email
Đừng nhầm lẫn điều này với khái niệm phạm vi trong Ruby 🙂
Tóm tắt
Bạn đã học về phạm vi &đối tượng ràng buộc trong Ruby!
Hãy nhớ rằng phạm vi xác định những biến nào bạn có thể truy cập tại bất kỳ thời điểm nhất định nào.
Nó giống như một bong bóng, các biến cục bộ có bong bóng riêng của chúng, trong khi các đối tượng chia sẻ bong bóng khác cho các biến ví dụ.
Cảm ơn vì đã đọc.