我有一个类方法,称之为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。有点这样做,但我仍在学习如何利用这种力量。有人可以帮我吗?我会得到我不朽的感激和主要的赞成票。
答案 0 :(得分: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
,但我已确认它可用作脚本。