在方法中使用常量作为参数?

时间:2011-10-17 01:27:05

标签: ruby-on-rails ruby

我的应用程序中的许多地方都使用了一种方法,包括某些控制器和其他模型。

class MyClass
  LONG_CONSTANT_1 = "function(x) { some_long_js_function }"
  LONG_CONSTANT_2 = "function(x) { another_really_long_js_function }"

  def self.my_group_method(my_constant)

    count = MyClass.collection.group(
      :keyf => my_constant,
      :reduce => "function(x, y) {y.count += x.count;}"
    )

  end  
end

所以即使在my_group_method内部调用的方法与MongoDB相关,问题本身也没有关系,基本上我希望能够调用

MyClass.my_group_method(LONG_CONSTANT_2)

MyClass.my_group_method(LONG_CONSTANT_1)

(实际上还需要几个常量,但示例只有2个)

不幸的是,我的实施会导致错误:NameError: wrong constant name LONG_CONSTANT_1

有关如何最好地实现此行为的任何想法?我可能会有几个长常量(实际上JS函数作为发送到MongoDB的字符串),我在这里使用的设计模式出错了什么?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

听起来你的常量存在范围问题。您希望将类方法称为:

MyClass.my_group_method(MyClass::LONG_CONSTANT_1)
MyClass.my_group_method(MyClass::LONG_CONSTANT_2)

我可以得到这个NameError:

uninitialized constant Object::LONG_CONSTANT_1 (NameError)

来自与您的代码结构相似的内容,但不是“错误的常量名称”错误。

如果常量的所有命名空间太多,那么你可以记录预期的输入(可能是符号)然后在你的类中:

INPUTS = (
    :long_symbol_1 => LONG_CONSTANT_1,
    :long_symbol_2 => LONG_CONSTANT_2
)

# Frobnicate the pancakes.
#
# The `which` argument should be `:long_symbol_1` or `:long_symbol_2`.
# etc.
def self.my_group_method(which)
    str = INPUTS[which]
    raise ArgumentError => "No idea what you're talking about" if(!str)
    #... continue on
end

这种方法会给你一些参数安全性,你的常量,并避免在调用者中使用MyClass::作为参数前缀的噪音。