微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

何时在Ruby中使用关键字参数aka命名参数

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

那么应该避免关键字参数,因为性能很小.

原文地址:https://www.jb51.cc/ruby/266846.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐