加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:50:11 所属栏目:百科 来源:网络整理
导读:Ruby 2.0.0支持关键字参数(KA),我想知道在纯Ruby的上下文中,这个功能的优点/使用情况是什么,特别是在看到由于需要每个关键字匹配的关键字匹配而导致的性能损失调用一个关键字参数的方法. require 'benchmark'def foo(a:1,b:2,c:3) [a,b,c]enddef bar(a,c) [a
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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读