đối số từ khóa có một vài lợi thế riêng biệt không ai đề cập đến.
Trước hết bạn không được ghép nối với thứ tự của các đối số. Vì vậy, trong trường hợp bạn có thể có một cuộc tranh luận nil thỉnh thoảng nó trông rất sạch:
def yo(sup, whats="good", dude="!")
# do your thing
end
yo("hey", nil, "?")
nếu bạn sử dụng đối số từ khóa:
def yo(sup:, whats:"good", dude:"!")
# do your thing
end
yo(sup: "hey", dude: "?")
hoặc thậm chí
yo(dude: "?", sup: "hey")
Nó loại bỏ các cần phải nhớ thứ tự của các đối số. Tuy nhiên, bất lợi là bạn phải nhớ tên của đối số, nhưng điều đó nên ít nhiều trực quan.
Ngoài ra, khi bạn có một phương pháp có thể có thể cần phải có nhiều đối số hơn trong tương lai.
def create_person(name:, age:, height:)
# make yourself some friends
end
gì xảy ra nếu hệ thống của bạn tất cả các đột ngột muốn biết về thanh kẹo yêu thích của một người, hoặc nếu họ bị thừa cân (từ tiêu thụ quá nhiều thanh kẹo yêu thích của họ), làm thế nào bạn sẽ làm điều đó? Đơn giản:
def create_person(name:, age:, height:, favorite_candy:, overweight: true)
# make yourself some fat friends
end
Trước khi đối số từ khóa luôn có hàm băm, nhưng điều đó dẫn đến nhiều mã mẫu soạn sẵn hơn để trích xuất và gán biến. Mã Boilerplate == nhập nhiều hơn == nhiều lỗi đánh máy tiềm năng == ít lần viết mã ruby tuyệt vời.
def old_way(name, opts={})
age = opts[:age]
height = opts[:height]
# all the benefits as before, more arthritis and headaches
end
Nếu bạn chỉ thiết lập một phương pháp mà phải mất một đối số và sẽ hầu như không bao giờ có nhu cầu thay đổi:
def say_full_name(first_name, last_name)
puts "#{first_name} #{last_name}"
end
luận Rồi từ khóa nên tránh, vì có một buổi biểu diễn nhỏ đánh.
Để thêm vào câu trả lời, hãy sử dụng chúng khi bạn cần gán các đối số cho các biến bên trong định nghĩa phương thức của bạn và tránh tự viết mã tùy chỉnh. – Kashyap
Xin đừng lừa chúng tôi. 'def welcome_message (message, options = {: name => 'hoge'}); "# {message} 、 # {options [: name]}"; end' là một lớp lót cho 'welcome_message'. Nhược điểm chính của phương pháp này, mặc dù, là một trong hai cần phải mở rộng 'Hash' với kinda' key_valid? 'Hoặc hy vọng rằng các phím thông qua là chính xác. Cách tiếp cận KA cho phép xác định chính xác các phím nào được cho phép. – mudasobwa
@mudasobwa Dường như với tôi bạn đã sai; với hàm của bạn, 'welcome_message (" message ", {: age => 22})' sẽ không hiển thị 'hoge' trong kết quả mà sẽ sử dụng' keyword'. Hàm bạn đặt giá trị mặc định cho toàn bộ băm, không phải là giá trị mặc định cho khóa được xác định của băm. – oldergod