簡體   English   中英

Ruby語法錯誤,意外的'=',預期為')'

[英]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)

在完全可選的參數(*表示法)之后使用可選參數不起作用,因為它會產生歧義。

閱讀更多信息:

http://www.skorks.com/2009/08/method-arguments-in-ruby/

您不能同時使用帶有默認值的splat和參數作為最后一個參數,這對於解析器來說太含糊(如何知道最后傳遞的arg是選項?)

您可以通過多種方式解決此問題; Rails的一個成語(主動支持)是:

def calculate(*args)
  options = args.extract_options!
  # ...
end

其中extract_options! 是從ActiveSupportArray的猴子補丁,定義如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM