[英]Ruby syntax error, unexpected '=', expecting ')'
我正在嘗試為Rubymonk編寫自己的Ruby練習解決方案,目的是創建三個方法(加,減和計算),因此在調用“計算”時,您可以根據以下內容確定數字是加還是減傳入的是什么。我收到以下錯誤:
main:11: syntax error, unexpected '=', expecting ')' def calculate(*numbers, options={})
誰能告訴我代碼的問題是什么? 感謝您提供的所有幫助!
def add(*numbers)
numbers.inject(0) {|sum, number| sum + number}
end
def subtract(*numbers)
numbers.inject{|diff, number| diff - number}
end
def calculate(*numbers, options={})
result = add(numbers) if options.empty?
result = add(numbers) if options[:add]
result = subtract(numbers) if options[:subtract]
result
end
def calculate(*numbers, options={})
不是有效的方法定義b / c *numbers
代替可變數量的參數。 我有兩種選擇-
def calculate(options={}, *numbers)
要么
def calculate(*args)
numbers, options = args[0..-2], args[-1] || {}
如果要保持相同的參數順序
splat參數*numbers
必須是最后一個參數。 否則,Ruby將如何知道何時將最后一個參數視為options
或最后一個數字?
您可以使用(*numbers, options)
(沒有默認值),但這將要求您始終將選項哈希傳遞給方法(否則,您的最后一個數字將被設置為options
變量)。
嘗試這種方式:
def calculate(options={},*numbers)
在完全可選的參數(*表示法)之后使用可選參數不起作用,因為它會產生歧義。
閱讀更多信息:
您不能同時使用帶有默認值的splat和參數作為最后一個參數,這對於解析器來說太含糊(如何知道最后傳遞的arg是選項?)
您可以通過多種方式解決此問題; Rails的一個成語(主動支持)是:
def calculate(*args)
options = args.extract_options!
# ...
end
其中extract_options!
是從ActiveSupport
到Array
的猴子補丁,定義如下:
def extract_options!
last.is_a?(::Hash) ? pop : {}
end
作為旁注:
如果您使用哈希,則邏輯可能會更簡單:
def calculate(*args) options = args.extract_options! method = options.fetch(:method, :add) send method, *args end
在add
,不需要inject(0)
,如果您不提供inject
,則inject
將數組的第一個元素用作第一個“ memo”值
您可以傳遞一個要注入的符號,該符號將是您在“ memo”值上調用的方法,並使用“ next value”作為參數:
(1..10).inject(:+) # this is the same as (1..10).inject{ |memo, next| memo + next } # or, more exactly (1..10).inject{ |memo, next| memo.send :+, next }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.