ruby中的键值对,数组与散列

时间:2017-08-10 09:19:52

标签: ruby

存储键值对的更好做法是什么?

数组:

class A
  DEFAULTS = [ONE = 1, TWO = 2]
end

或哈希:

class A
  DEFAULTS = {'ONE' => 1, 'TWO' => 2 }
end

3 个答案:

答案 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)

嗯,你不太明白第一个是如何工作的。

在这种情况下,您创建:

  • A类
  • A :: DEFAULTS == [1, 2]
  • A :: ONE
  • A :: TWO

所以表达式DEFAULTS = [ONE = 1, TWO = 2]没有多大意义。

等于

class A
  DEFAULTS = [1, 2]
  ONE = 1
  B = 2
end

因此,您需要决定如何访问这些常量:通过A::ONE或通过A::DEFAULTS['ONE']

P.S。我建议你阅读有关Ruby模块的内容(如果你愿意,你可以称它们为名字)。这非常重要