gpt4 book ai didi

ruby - 为什么有一个大数组会导致 NoMethodError 需要更长的时间才能被提升

转载 作者:行者123 更新时间:2023-12-04 10:33:20 27 4
gpt4 key购买 nike

我有以下 Ruby 代码,其中 BigClass 的每个实例创建一个具有 BigClass 实例的数组(直到最大深度)。

class BigClass
# Increase this depending on your computer performance
MAX_DEPTH = 8

def initialize(depth = 0)
@my_arr = []

5.times do |i|
unless depth > MAX_DEPTH
@my_arr << BigClass.new(depth+1)
end
end
end
end

big_class = BigClass.new

puts "Reaches here"

# This line should throw an error but instead freezes
big_class.blah

puts "Doesn't reach here"

调用不存在的方法时,我希望收到 NoMethodError然而,几乎立即, big_class 中的数组内容似乎越大。产生错误所需的时间越长。

为什么是这样?

我考虑过的几个选项:
  • 也许 Ruby 在抛出错误之前会进行某种清理或为所有创建的实例调用一些钩子(Hook)。但是,如果我从不同的对象或现有方法中发生错误,它会立即引发错误。
  • 也许 Ruby 方法查找出于某种原因包括实例变量查找,但在阅读此 GitHub Gist 后我找不到任何表明这将是原因

  • 我注意到,当它打印“到达这里”时,如果我退出 (CTRL-C),它会立即打印出 NoMethodError。 .因此,查找该方法是否存在似乎不是问题,否则它不会知道这是我退出时的错误。

    最佳答案

    我想我解决了。

    如果我覆盖 #inspect BigClass的方法它不再引起问题。这让我觉得内部有东西在调用 #inspect处理错误时。由于默认检查将包括实例变量,并且也对它们调用检查,如果有很多实例变量并且它们都有很多实例变量,那么处理可能需要很长时间。

    下面的代码显示了一个按我预期运行的版本:

    class BigClass
    # Increase this depending on your computer performance
    MAX_DEPTH = 8

    def initialize(depth = 0)
    @my_arr = []

    5.times do |i|
    unless depth > MAX_DEPTH
    @my_arr << BigClass.new(depth+1)
    end
    end
    end

    def inspect
    "now it works"
    end
    end

    big_class = BigClass.new

    puts "Reaches here"

    # Correctly raises an error now
    big_class.blah_blah_blah

    puts "Doesn't reach here"

    关于ruby - 为什么有一个大数组会导致 NoMethodError 需要更长的时间才能被提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60309643/

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