删除哈希

时间:2014-01-31 17:40:08

标签: ruby methods hash options

所以这是有效的,除了一个问题,它来自方法计算。我正在使用一个TDD程序,它告诉我一切正常,除了当计算通过(0,3,5)时它会插入5个选项,当它真的应该默认添加并添加所有数字到0,3,5因为选项部分为空白。我如何设置它以便删除选项,或者如果没有任何内容就传递true,以便代码通过而不添加:true或subtract: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

1 个答案:

答案 0 :(得分:0)

您可以使用在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 => :+的简写。 (并非所有Rubyist都赞同以前的术语。)它看起来像哈希的一个元素,是吗?事实上,这正是它的本质。
  • 当然,您不必使用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