关键字参数有一些没有人提到的明显优势。
首先,您与参数的顺序无关。所以在你偶尔可能有一个 nil 参数的情况下,它看起来更干净:
def print_greeting(name, message = "Hello")
puts "#{message}, #{name}"
end
print_greeting("John Connor", "Hasta la vista")
如果您使用关键字参数:
def print_greeting(message: "Hello", name:)
puts "#{message}, #{name}"
end
print_greeting(message: "Hasta la vista", name: "John Connor")
甚至
print_greeting(name: "John Connor", message: "Goodbye")
它消除了必须记住参数顺序的需要。但是,缺点是您必须记住参数的名称。这应该或多或少直观,并且可以说会导致更仔细考虑的方法签名。
使用关键字参数的另一个好处是,当您有一个将来可能需要额外参数的方法时。
def create_person(name:, age:, height:)
# make yourself some friends
end
如果您的系统要求现在需要了解一个人最喜欢的糖果棒,或者他们是否超重(因为食用了太多他们最喜欢的糖果棒),该怎么办?你怎么能使用关键字 args 来做到这一点?简单的:
def create_person(name:, age:, height:, favorite_candy:, overweight: true)
# make yourself some fat friends
end
在关键字参数之前总是有哈希,但这导致了更多的样板代码来提取和分配变量。样板代码 == 更多打字 == 更多潜在错别字 == 更少时间编写出色的 ruby 代码。
def old_way(name, opts={})
age = opts[:age]
height = opts[:height]
# all the benefits as before, more arthritis and headaches
end
如果您只是设置一个采用一个参数并且很可能永远不需要更改的方法:
def say_full_name(first_name, last_name)
puts "#{first_name} #{last_name}"
end
然后应避免使用关键字参数,因为对性能的影响很小。