0

我写了这个简单的方法:

 def has_kontakt?(*depa)
   return JSON.parse(self.kontakte).include?(*depa.to_s)
 end

你可以看到我定义depa为一个可选参数。不知何故,无法使用include?(*depa.to_s).

以前我有:

 def has_kontakt?(depa)
   return JSON.parse(self.kontakte).include?(depa.to_s)
 end

一切都运作良好。我做错了什么?

4

2 回答 2

2

这不是您定义可选参数的方式。* 是一个 splat 运算符(http://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat/)。您需要一个可选参数,它看起来更像这样:

def has_kontakt?(depa=nil)
  if depa.nil?
    # no argument was passed in
  else
    # depa was specified
  end
end

顺便说一句,您不需要指定return. Ruby 自动返回最后计算的值。

于 2013-11-06T15:13:58.633 回答
1

在参数前添加星号不会将其标记为可选。相反,它允许您传递任意数量的参数,然后将这些参数作为数组传递给方法:

def method(*args)
  puts args.inspect
end

method :foo
# => [:foo]

method foo, :bar, :baz
# => [:foo, :bar, :baz]

正因为如此,*depa.to_s并不是真的有用。我猜,您要么想通过添加这样的默认值来实际定义可选参数:

def has_kontakt?(depa="")
   return JSON.parse(self.kontakte).include?(depa.to_s)
end

或者您想正确处理数组(取决于您实际想要实现的目标)

def has_kontakt?(*depa)
   # return true if all depa values are contained in self.kontakte (assuming it's an array)
   return (depa & JSON.parse(self.kontakte)) == depa
end
于 2013-11-06T15:14:45.577 回答