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

Lập luận phương pháp mạnh mẽ của Ruby &Cách sử dụng chúng đúng cách

Tôi nhận được một email hỏi ý kiến ​​của tôi về thời điểm sử dụng các đối số từ khóa.

Tôi nghĩ rằng tôi sẽ mở rộng câu trả lời của mình thành một bài viết đầy đủ về các đối số của phương thức Ruby để mọi người đều có thể hưởng lợi !

Ruby rất linh hoạt khi nói đến các đối số của phương thức.

Chúng tôi có mọi thứ :

Từ các đối số bắt buộc tiêu chuẩn đến các đối số tùy chọn và thậm chí cả các đối số từ khóa (được đặt tên).

Trong bài viết này, bạn sẽ tìm hiểu về sự khác biệt giữa tất cả các loại đối số này và sử dụng loại đối số nào tùy thuộc vào tình huống của bạn.

Sử dụng đúng loại đối số sẽ giúp mã của bạn dễ đọc và dễ làm việc hơn.

Khi nghi ngờ, hãy sử dụng các lập luận chuẩn

Các đối số bắt buộc là những gì bạn nhận được theo mặc định.

Đây là một ví dụ :

def write(file, data, mode)
end

write("cats.txt", "cats are cool!", "w")

Nếu bạn không vượt qua số đối số chính xác được yêu cầu, bạn sẽ nhận được thông báo lỗi quen thuộc sau:

write("shopping_list.txt", "bacon")

ArgumentError: wrong number of arguments (2 for 3)

Điều này có nghĩa là bạn đã cung cấp phương thức 2 đối số, nhưng nó cần 3 !

Phương pháp linh hoạt với đối số tùy chọn

Bạn có thể muốn làm cho một số đối số của mình là tùy chọn bằng cách cung cấp một giá trị mặc định.

Ví dụ :

def write(file, data, mode = "w")
end

Bây giờ bạn có thể gọi write với 2 đối số, trong đó mode sẽ bằng giá trị mặc định ("w" ), hoặc bạn có thể chuyển vào 3 đối số để ghi đè giá trị mặc định và nhận các kết quả khác nhau.

Giá trị mặc định này giúp bạn tiết kiệm một số công việc khi gọi phương thức này trong khi vẫn cung cấp cho bạn tùy chọn để thay đổi nó.

Sử dụng đối số từ khóa để tăng độ rõ ràng

Một trong những nhược điểm của các đối số bắt buộc &mặc định là chúng phụ thuộc vào thứ tự.

Có nghĩa là bạn phải chuyển các đối số theo cùng một thứ tự

Nếu bạn chuyển chúng không đúng thứ tự :

Bạn sẽ nhận được kết quả bất ngờ!

Ví dụ:trong write , bạn phải gọi nó bằng tệp file đầu tiên, sau đó đến data &cuối cùng là chế độ file .

def write(file, data, mode)
end

Các đối số từ khóa cho phép bạn thay đổi thứ tự của các đối số.

Đây là một ví dụ :

def write(file:, data:, mode: "ascii")
end

Điều này cho phép bạn gọi phương thức theo một thứ tự khác:

write(data: 123, file: "test.txt")

Nhưng quan trọng hơn, khi bạn gọi phương thức, bạn có thể thấy rõ ràng ý nghĩa của các đối số .

Tôi không thấy mình sử dụng các đối số từ khóa thường xuyên, nhưng chúng có thể hữu ích khi bạn muốn thêm rõ ràng cho các lệnh gọi phương thức.

Giả sử chúng ta có một Point lớp học.

Bạn có thể viết nó như thế này :

class Point
  def initialize(x: , y:)
    @x, @y = x, y
  end
end

point = Point.new(x: 10, y: 20)

Bằng cách này, không có sự nhầm lẫn nào có thể xảy ra trong hai số (10 &20) tương ứng với x giá trị hoặc y giá trị.

Đó là một trong những mục tiêu chính của bạn khi viết mã, để tránh nhầm lẫn và hiểu nhầm nhiều nhất có thể .

Nếu việc sử dụng các đối số từ khóa giúp bạn làm được điều đó thì hãy sử dụng chúng.

Hãy nghĩ về điều này :

“Việc thêm các đối số từ khóa sẽ làm cho điều này dễ hiểu hơn hay nó sẽ thêm công việc và sự lộn xộn vào mã của tôi?”

Một điều khác về các đối số từ khóa là chúng rất rõ ràng về các đối số mà bạn đang thiếu.

Ví dụ :

point = Point.new

# missing keywords: x, y

Bạn cũng có thể kết hợp các đối số từ khóa với các đối số thông thường.

Một chiến lược mà tôi đã quan sát trên các phương thức tích hợp sẵn của Ruby là các phiên bản mới có xu hướng thêm các đối số mới, tùy chọn, làm đối số từ khóa .

Ví dụ về điều này là các đối số từ khóa cho Float#round , Kernel#clone &String#lines được giới thiệu trong Ruby 2.4.

Sử dụng các đối số có thể thay đổi để thu được càng nhiều giá trị càng cần thiết

Điều gì xảy ra nếu bạn muốn lấy số lượng giá trị không giới hạn?

Sau đó, bạn có thể sử dụng đối số biến :

def print_all(*args)
end

print_all(1, 2, 3, 4, 5)

Điều này cho phép bạn gọi phương thức với bất kỳ số lượng đối số nào, kể cả đối số không. Đối số biến là một mảng có tất cả các giá trị được truyền cho nó.

Bạn có thể kết hợp điều này với các loại đối số khác.

Ví dụ :

def print_all(title, *chapters)
end

Điều này sẽ nhận đối số đầu tiên là title và phần còn lại dưới dạng chapters mảng. Lưu ý rằng đối số biến cần phải là sau tất cả các đối số bắt buộc &tùy chọn của bạn và trước bất kỳ đối số từ khóa nào.

Sử dụng đúng thứ tự

Dưới đây là thứ tự hợp lệ của các đối số nếu bạn muốn kết hợp chúng và tránh lỗi cú pháp:

required -> optional -> variable -> keyword

Đây là phương pháp hiển thị mọi loại đối số có thể có :

def testing(a, b = 1, *c, d: 1, **x)
  p a,b,c,d,x
end

testing('a', 'b', 'c', 'd', 'e', d: 2, x: 1)

**x giống như đối số biến, nhưng đối với đối số từ khóa. Nó sẽ là một hàm băm thay vì một mảng.

Lập luận nắm bắt tất cả

Trong một số trường hợp hiếm hoi, bạn có thể thấy điều này:

def print_all(*)
end

Điều này có nghĩa là phương pháp đang chấp nhận bất kỳ đối số nào, nhưng nó không làm được gì với chúng. Nó tương tự như sử dụng ký tự gạch dưới (_ ) bên trong một khối để hiển thị đối số nào bạn không sử dụng.

Một cách sử dụng thực tế cho việc này có thể là kết hợp với từ khóa super:

class Food
  def nutrition(vitamins, minerals)
    puts vitamins
    puts minerals
  end
end

class Bacon < Food
  def nutrition(*)
    super
  end
end

bacon = Bacon.new

bacon.nutrition("B6", "Iron")

Bây giờ khi nutrition của Food thay đổi danh sách đối số của nó, bạn không phải thay đổi đối số trong Bacon quá.

Tóm tắt

Bạn đã học về các đối số phương pháp mạnh mẽ của Ruby và cách sử dụng chúng! Các đối số bắt buộc là một khởi đầu tốt, sau đó bạn có thể thêm tính linh hoạt với các đối số tùy chọn và thêm rõ ràng với các đối số từ khóa.

Hy vọng bạn thấy điều này hữu ích và thú vị!

Chia sẻ bài đăng này trên Twitter để nhiều người có thể xem bài đăng này 🙂