我有一个重复使用幻数的方法,但只能在一种方法中使用。
class Foo
def Bar(str)
year = str[0..1].to_i + 2000
month = str[2].ord - 48
day = str[3].ord - 48
hour = str[4].ord - 48
min = str[5].ord - 48
sec = str[6].ord - 48
# ...
end
end
[如果您想知道是否需要在此使用ord
而不是to_i
,您可能希望看到this other question了解更多背景信息。]
我想在此删除48
幻数。唯一可以使用这个神奇数字的地方就是这个特定的方法。我无法将其声明为方法中的常量:
class Foo
def Bar
ADJ = 48
month = str[2].ord - ADJ
day = str[3].ord - ADJ
hour = str[4].ord - ADJ
min = str[5].ord - ADJ
sec = str[6].ord - ADJ
# ...
end
end
因为这会导致dynamic constant assignment (SyntaxError)
错误。由于此处ADJ
仅适用于此方法,因此将其作为类变量对我来说没有多大意义。
此功能将被频繁调用;我希望解决方案至少不要慢。
在C ++中,我可能会在方法中将其设为static const unsigned
,或将其移至未命名的namespace
。
Rubyist如何消除这个神奇数字?
答案 0 :(得分:2)
您应该将此常量移动到类/模块定义。
最好将方法移动到模块并在那里添加常量:
module Foo
XYZ = ...
def bar
...
end
end
答案 1 :(得分:2)
我的建议是只使用一个变量。
adj = 48
您没有得到保护常量会使您反对更改的值,但该变量仅限于单个方法。通过查看代码和单元测试来确保方法按预期运行应该不难。