存储键值对的更好做法是什么?
数组:
class A
DEFAULTS = [ONE = 1, TWO = 2]
end
或哈希:
class A
DEFAULTS = {'ONE' => 1, 'TWO' => 2 }
end
答案 0 :(得分:5)
哪种更好的做法?
TL; DR你可能想要一个哈希。
您的第一个示例看起来像键和值,但它实际上等同于:
ds = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true
}
});
所以你要创建三个常量:
class A
ONE = 1
TWO = 2
DEFAULTS = [ONE, TWO]
end
您必须通过索引A.constants #=> [:DEFAULTS, :ONE, :TWO]
A::ONE #=> 1
A::TWO #=> 2
A::DEFAULTS #=> [1, 2]
和0
访问数组值:
1
第二个只创建一个常量
A::DEFAULTS[0] #=> 1
A::DEFAULTS[1] #=> 2
您可以通过密钥A.constants #=> [:DEFAULTS]
A::DEFAULTS #=> {"ONE" => 1, "TWO" => 2 }
和'ONE'
访问这些值:
'TWO'
第三种选择是使用命名空间模块:
A::DEFAULTS['ONE'] #=> 1
A::DEFAULTS['TWO'] #=> 2
创建嵌套常量:
class A
module DEFAULTS
ONE = 1
TWO = 2
end
end
答案 1 :(得分:1)
无论如何都要问“哪个是更好的做法”,因为他们完全不同的事情。
第一个代码段
TWO
的常量,并为其指定值2
ONE
的常量,并为其指定值1
DEFAULTS
的常量,并为其指定值[1, 2]
第二个代码段
DEFAULTS
的常量,并为其指定值{ 'ONE' => 1, 'TWO' => 2 }
两个代码片段几乎没有任何共同之处。不可能有这样的情况,你可以选择使用其中一种。
答案 2 :(得分:0)
嗯,你不太明白第一个是如何工作的。
在这种情况下,您创建:
[1, 2]
所以表达式DEFAULTS = [ONE = 1, TWO = 2]
没有多大意义。
等于
class A
DEFAULTS = [1, 2]
ONE = 1
B = 2
end
因此,您需要决定如何访问这些常量:通过A::ONE
或通过A::DEFAULTS['ONE']
P.S。我建议你阅读有关Ruby模块的内容(如果你愿意,你可以称它们为名字)。这非常重要