0

私は次の機能を持っています-

def add (*nums)
  nums.reduce(:+)
end

def subtract(first, *rest)
  first - rest.reduce(:+)
end

def calculate(*nums, options)
  first = nums.first
  rest = nums.reverse.drop(1)
  add(*nums) if options.size == 0
end     

以下は、関数を呼び出したときに受け取るエラーです-

構文エラー、予期しない'='、予期する')' defcalculate(* nums、options = {})^

私の構文のエラーは何ですか?

4

2 に答える 2

2

splatted パラメータの後にデフォルト パラメータを指定することはできません。これにより、パーサーのあいまいさが生じます。例えば:

calculate 1, 2, 3, 4

4 は に行くべきですか、numsまたは割り当てられるべきoptionsですか?

いくつかのオプションが利用可能です

オプションのデフォルト パラメータを削除する

def calculate(*nums, options)
  # implementation
end

calculate 1, 2, 3, add: true # options
calculate 1, 2, 3, {} # no options

スプラットを外す

def calculate(nums, options = {})
  # implementation
end

calculate [1, 2, 3], add: true # options
calculate [1, 2, 3] # no options

両方を維持しながら、より多くの作業を行う

@muistooshort の回答を参照

于 2012-07-27T06:21:31.750 に答える
2

感嘆符とオプションも使用できます。手で並べ替えるだけです。

def calculate(*nums)
  options = nums.last.is_a?(Hash) ? nums.pop : { }
  #...

それからあなたは難なく言うことcalculate(1, 2, 3)ができます。calculate(1, 2, :size => 0)もちろん、これは Hash が の何かに対して有効な値ではないことを前提としていますnums

于 2012-07-27T06:31:32.250 に答える