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 🙂