0

渡されたキーワード引数に応じて、または数値calculateを決定するメソッドを作成しようとしています。addsubtract

メソッドは次のとおりです。

def add(*num)
  num.inject(:+)
end

def subtract(*num)
  num.reduce(:-)
end

def calculate(*num, **op)
  return add(num) if op[:add] || op.empty?
  return subtract(num) if op[:subtract]
end

puts calculate(1, 2, 3, add: true)
puts calculate(1, 2, 3, subtract: true)

この関数を実行すると、次の結果が得られます。

1
2
3

1
2
3
4

2 に答える 2

2

putsあなたの友達です:

def add(*num)
  puts "in add, num = #{num}, num.size = #{num.size}"
  num.inject(:+)
end

def calculate(*num, **op)
  puts "num = #{num}, op = #{op}"
  return add(num) if op[:add] || op.empty?
end

calculate(1, 2, 3, add: true)
  # num = [1, 2, 3], op = {:add=>true}
  # in add, num = [[1, 2, 3]], num.size = 1
  #=> nil

今修正calculate

def calculate(*num, **op)
  puts "num = #{num}, op = #{op}"
  return add(*num) if op[:add] || op.empty?
end

calculate(1, 2, 3, add: true)
  # num = [1, 2, 3], op = {:add=>true}
  # in add, num = [1, 2, 3], num.size = 3
  # => 6 
于 2015-02-21T21:01:16.097 に答える
0

あなたが書く :

return add(*num) if opt[:add] || opt.empty?

同様に、リターン減算を変更します..一部も。

投稿されたコードで num は [[1,2,3]] になり、したがって [[1,2,3]].inject(:+) はレシーバーを返します。puts を呼び出したので、取得したとおりに出力されます。

于 2015-02-21T20:16:20.227 に答える