我写了这个简单的方法:
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
一切运作良好。我做错了什么?
答案 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