gpt4 book ai didi

ruby - 评估卡住的字符串

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:35 25 4
gpt4 key购买 nike

我模糊的理解是,使用 Ruby 2.2 的 frozen 字符串方法或 Ruby 2.3 的 frozen-string-literal: true pragma,一个相关的卡住字符串在整个程序执行过程中,文字仅被评估一次当且仅当字符串没有插值。以下似乎说明了这一点:

未插值

#frozen-string-literal: true
5.times{p "".object_id}

输出(相同的对象 ID):

70108065381260
70108065381260
70108065381260
70108065381260
70108065381260

插值

#frozen-string-literal: true
5.times{p "#{}".object_id}

输出(不同的对象 ID):

70108066220720
70108066220600
70108066220420
70108066220300
70108066220180
  1. 这个属性(即只计算一次)叫什么?它应该与不变性不同。
  2. 我对字符串具有这种属性的条件的理解是否正确?哪里有提到这个的官方文档?
  3. 有没有办法让内插字符串只计算一次?

最佳答案

  1. Interning .这些字符串被称为interned
  2. 不完全是。更像是解释器是否可以在评估字符串之前决定字符串的值是什么。例如,考虑:

    5.times { puts "#{'foo'}".object_id }

    即使涉及插值,id 也是相同的。

  3. 没有。这是一个内部优化。 Object#freeze 的要点是不变性。


更新:只有文字字符串会被内部化。这是显而易见的 here .

我找不到负责插值的代码部分。所以我不确定为什么 "#{'foo'}" 被认为是文字字符串。请注意,无论这种翻译发生在哪里,它都处于较低的解析器级别,并且发生在任何实际处理之前。 String#freeze 映射到 rb_str_freeze 的事实证明了这一点,它不调用 opt_str_freeze .

关于ruby - 评估卡住的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34469411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com