1

我有一个类方法,称之为 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 - 而不是 'dog',并且我不分青红皂白地传入变量而不考虑顺序。我假设有一个元编程块/proc/etc。某种方式来做到这一点,但我仍在学习如何利用这种力量。有人可以帮我吗?我将收到我永恒的感谢和主要的赞成票。

4

1 回答 1

1

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

您可以滥用method_missing并将const_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,但我已经确认它可以作为脚本使用。

于 2013-08-28T22:10:28.053 回答