【问题标题】:How can ONE Ruby-symbol map to MULTIPLE values?一个 Ruby 符号如何映射到多个值?
【发布时间】:2020-09-18 15:13:28
【问题描述】:

从我目前所读到的内容中,我知道一个符号总是指向相同的值。与字符串不同,字符串在 Ruby 中是可变的。意味着一个字符串可能不会一直具有相同的值。

但是,如果我创建一个哈希列表,例如这个:

persons = [
           {first_name: "John", last_name: "Doe"}, 
           {first_name: "Lisa", last_name: "Meyer"}
          ]

如果我现在这样做:

persons[1][:first_name]

然后我得到正确的值“Lisa”。

但它是如何工作的呢?

如果一个符号只能指向一个精确值:

如何区分第一个哈希的“first_name”-symbol 和第二个、第三个...哈希的“first_name”-symbol?

【问题讨论】:

  • 您的问题非常不清楚。 “一个符号总是指向同一个值”是什么意思? Ruby 没有指针,那么“指向”是什么意思呢?
  • “一个符号总是指向同一个值”——这与哈希无关。此类语句引用符号的内部值。这意味着您不能拥有不同的 :first_name 实例。这同样适用于整数:你不能有不同的 1 实例。

标签: ruby


【解决方案1】:

在您的示例中,您选择数组索引 1 处的对象。

 {first_name: "Lisa", last_name: "Meyer"}

first_name 键的值怎么可能与“Lisa”不同?

【讨论】:

    【解决方案2】:
    persons = [
     { first_name: "John", last_name: "Doe" }, 
     { first_name: "Lisa", last_name: "Meyer"}
    ]
    

    persons 是一个哈希数组。数组可以通过索引访问。

    所以,persons 中的索引 0 是 { first_name: "John", last_name: "Doe" }

    persons 中的索引 1 是 { first_name: "Lisa", last_name: "Meyer"} 等等:

    p persons[0] # {:first_name=>"John", :last_name=>"Doe"}
    p persons[1] # {:first_name=>"Lisa", :last_name=>"Meyer"}
    

    不要对这里的可变性感到困惑。只是你指的是错误的数据类型。

    如果需要,您可以检查 persons 中的每个哈希键,并查看它们是否具有相同的 object_id(first_namelast_name)。这是因为符号是不可变的,只要您的代码正在运行,Ruby 就只能创建它们的一个实例:

    persons.map { |e| e.map { |key, _| [key, key.object_id] }.to_h }
    # [{:first_name=>1016988, :last_name=>1017308}, {:first_name=>1016988, :last_name=>1017308}]
    

    根据评论问题;不,它不会根据范围创建新对象,例如:

    p :first_name.object_id
    # 1016668
    
    def persons
      [{ first_name: "John", last_name: "Doe"  }, 
       { first_name: "Lisa", last_name: "Meyer"}]
    end
    
    p persons.map { |e| e.map { |key, _| [key, key.object_id] }.to_h }
    # [{:first_name=>1016668, :last_name=>1017308}, {:first_name=>1016668, :last_name=>1017308}]
    

    :first_name.object_id 定义在persons 方法的范围之外,但在方法内部时,它一直指向同一个对象。

    【讨论】:

    • 可以说,它总是在0的范围内创建一个新的符号“first_name”,在1的范围内……等等?
    • 不,它没有。符号:first_name 只创建一次。不论范围。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2019-09-08
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多