【问题标题】:Removing a Hash [duplicate]删除哈希 [重复]
【发布时间】:2014-01-31 17:40:08
【问题描述】:

所以这是可行的,除了一个问题,它属于方法计算。我正在使用 TDD 程序,它告诉我一切正常,除了当计算通过 (0,3,5) 时,它会插入 5 作为选项,而实际上它应该只是默认为加法并将所有数字相加到0, 3, 5 因为选项部分是空白的。我该如何做到这一点,以便删除选项,或者如果那里什么都没有,则只传递 true 以便代码通过而不添加:true 或减去:true?

def add(*numbers)
  numbers.inject(0) { |sum, number| sum + number }
end

def subtract(number1,*additionalnums)
  number1-add(*additionalnums)
end

def calculate(*addsubtract, options)
  result = add(*addsubtract) if options[:add]
  result = subtract(*addsubtract) if options [:subtract]
  result = calculate.delete(-1) if options.is_a?(Symbol)
  result
end

【问题讨论】:

  • 请用语言标记您的问题。
  • 你能编辑你的问题并添加一些关于如何使用的代码吗?这看起来是一种非常尴尬的方式,可能会被改进。
  • 嗯...我去看看。
  • 它并不完全是重复的,但问题是对 splats 的类似误解。这个问题应该可以解决问题。
  • 因此,DGM 引用的“splat 参数后的可选参数”的答案实际上是我试图在 RubyMonk 网站上找出的问题的给定解决方案。显然,那个人正在做同样的事情。我明白为什么会这样。但是,我试图弄清楚是否有一种方法可以根据我当前的代码进行计算,在 splat 之后使用一个选项,如果没有传递给它,它会以某种方式使选项无效。

标签: ruby methods hash options


【解决方案1】:

您可以使用 Ruby 2.0 中引入的 named parameters(又名“关键字参数”):

   def doit(*args, op: :+)
     args.reduce { |t,e| t.send(op, e) }
   end

   doit(1, 2, 3)           # =>  6   
   doit(1, 2, 3, op: :-)   # => -4  
   doit(1, 2, 3, op: :*)   # =>  6  
   doit(1.0, 2, 3, op: :/) # =>  0.166..
  • 在对doit 的调用中,这些不是笑脸。
  • op 的默认值由op: :+ 给出。这是:op => :+ 的简写。 (并不是所有的 Ruby 主义者都赞成以前的术语。)它看起来像一个哈希元素,是吗?事实上,这正是它的本质。
  • 当然,您不必使用Object#send。例如,您可以使用Object#case,特别是如果您想传递除四大之外的方法时。在这种情况下,您可能更喜欢传递字符串,而不是符号:

   def doit(*args, op: '+')
     case op
     when '+', '-', '*'. '/'
       args.reduce { |t,e| t.send(op.to_sym, e) }
     when 'min'
       args.min
     when 'avg'
       args.any? ? args.reduce(:+)/args.size.to_f : 0.0
     when 'and_so_on'
       ...
     end
   end

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2015-04-25
    • 2015-02-23
    • 1970-01-01
    • 2010-12-31
    • 2018-07-27
    • 2012-12-05
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多