为什么我不能检索方法的可选参数?

时间:2013-11-06 15:07:23

标签: ruby-on-rails ruby

我写了这个简单的方法:

 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

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

2 个答案:

答案 0 :(得分: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自动返回计算的最后一个值。

答案 1 :(得分: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