【问题标题】:How symbols equal each others?符号如何彼此相等?
【发布时间】:2014-05-09 09:49:43
【问题描述】:

当我做:symbol == :symbol 时,我发现这是真的。它们是一样的。

如果是这样,我们如何创建这样的数组:

a = [{:name=>"Michael"},{:name=>"John"}]

【问题讨论】:

  • 为什么你认为这不可能?
  • 那里没有矛盾。 a 中的元素是不同的,而且数组可以包含重复的元素。您可能正在考虑哈希,在这种情况下键必须是唯一的,并且您确实不会在键集中找到两次出现的 :symbol
  • @DouglasFShearer 它只是让我感到困惑,因为第一个 :name 与另一个哈希中的第二个 :name 相同
  • key是一样的,但是每个hash都不一样。您不会看到两个或多个与哈希中的键相同的符号实例:people = {name: 'Joe', name: 'Jane', name: 'Sally'}。要建立一些关于为什么这是非法的直觉,想想people[:name] 应该产生什么。同样,a[0]a[1] 没有这样的概念困难。

标签: ruby arrays symbols


【解决方案1】:

看下面的代码:

a = [{:name=>"Michael"},{:name=>"John"}]
a.map(&:object_id) # => [70992070, 70992050]

这是因为a是一个Hash数组,但它们是2个不同的hash对象。在 Ruby 中,Hash 必须有 uniq 键。但是 2 个不同的哈希可以有相同的命名符号作为键。

【讨论】:

    【解决方案2】:

    您似乎对哈希键感到困惑。一个散列不能包含两次相同的键,但两个不同的散列可以具有相同的对象作为键。例如:

    a_key = "hello"
    spanish = { a_key => "hola" }
    french = { a_key => "bonjour" }
    some_array = [spanish, french]
    

    最重要的是,数组可能包含重复的对象(例如[1, 2, 1] 是有效的)——但这些甚至不是重复的。包含相同键的两个哈希仍然是不同的对象。

    这样的数组并没有什么不寻常的地方。事实上,数组中的散列有共同的键是很正常的,因为通常如果你想把东西放在一个数组中,这意味着它们有一些共同点,你可以用同样的方式来处理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2022-12-01
      • 2018-08-31
      相关资源
      最近更新 更多