Ruby 2.0.0支持关键字参数(KA),我想知道在纯Ruby的上下文中,这个功能的优点/使用情况是什么,特别是在看到由于需要每个关键字匹配的关键字匹配而导致的性能损失调用一个关键字参数的方法.
require 'benchmark' def foo(a:1,b:2,c:3) [a,b,c] end def bar(a,c) [a,c] end number = 1000000 Benchmark.bm(4) do |bm| bm.report("foo") { number.times { foo(a:7,b:8,c:9) } } bm.report("bar") { number.times { bar(7,8,9) } } end # user system total real # foo 2.797000 0.032000 2.829000 ( 2.906362) # bar 0.234000 0.000000 0.234000 ( 0.250010)
解决方法
关键词参数有一些明显的优点,没有人碰到过.
首先,你不符合论据的顺序.所以在你偶尔会有一个零参数的情况下,它看起来很干净:
def yo(sup,whats="good",dude="!") # do your thing end yo("hey",nil,"?")
如果使用关键字参数:
def yo(sup:,whats:"good",dude:"!") # do your thing end yo(sup: "hey",dude: "?")
甚至
yo(dude: "?",sup: "hey")
它不需要记住参数的顺序.但是,缺点是您必须记住参数的名称,但应该是或多或少的直观.
此外,当您有一种方法可能需要在未来采取更多的争议.
def create_person(name:,age:,height:) # make yourself some friends end
如果你的系统突然想知道一个人最喜欢的糖果吧,或者如果他们超重(从消费太多的他们最喜欢的糖果吧),你该怎么办?简单:
def create_person(name:,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
那么应该避免关键字参数,因为性能很小.