Computer >> Máy Tính >  >> Lập trình >> Ruby

Tìm hiểu Phạm vi biến &Đối tượng ràng buộc trong Ruby

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.