使用可选参数在Ruby中调用方法,无论参数列表中的位置如何,并设置为hash

时间:2013-08-28 18:06:42

标签: ruby parameters block

我有一个类方法,称之为PetSearch。我想通过类变量@@ options来初始化带有选项的搜索。我可以传入一个数组或一个哈希。选择数组:

def self.init_options(options=['dog', 94123, 'Young', 'F'])  
  @@options[:animal] = options[0]  
  @@options[:location] = options[1]  
  @@options[:age] = options[2]
  @@options[:sex] = options[3]
end  

但是,我希望能够传递以下选项:

def self.init_options(dog, Young)
   @@options[:dog] = dog
   @@options[:age] = Young
end

请注意,我想传入一个像狗一样的非字符串“变量” - 而不是'dog',而且我不加思索地传递变量而不考虑顺序。我假设有一个元编程块/ proc / etc。有点这样做,但我仍在学习如何利用这种力量。有人可以帮我吗?我会得到我不朽的感激和主要的赞成票。

1 个答案:

答案 0 :(得分:1)

我永远不会建议这样做,而且它没有意义:收集用户输入的大部分方式都是字符串(例如,脚本参数,表单值等)。

您可以滥用method_missingconst_missing将参数作为非字符串传递。

因此,在您的课程或模块中,您可以使用以下内容:

def self.init_options(*args)
  @@options[:dog] = args.grep(/[Dd]og|etc|etc/).first
  @@options[:age] = args.grep(/[Oo]ld|[Yy]oung/).first
end

def self.options
  @@options
end

然后,在您的用户正在进行“初始化”的上下文中:

def method_missing(m)
  m.to_s
end

def Object.const_missing(c)
  c.to_s
end

Testmm.init_options(dog, Young)
puts Testmm.options.inspect
#=> {:dog=>"dog", :age=>"Young"}

不确定这是否是您正在寻找的行为,但听起来就像是这样。另请注意,这不适用于IRB,但我已确认它可用作脚本。