gpt4 book ai didi

ruby - 我应该如何避免内存导致 Ruby 中的错误?

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

是否已就如何避免因可变状态导致的记忆化错误达成共识?

在此示例中,缓存结果的状态发生了变化,因此在第二次调用时给出了错误的结果。

class Greeter

def initialize
@greeting_cache = {}
end

def expensive_greeting_calculation(formality)
case formality
when :casual then "Hi"
when :formal then "Hello"
end
end

def greeting(formality)
unless @greeting_cache.has_key?(formality)
@greeting_cache[formality] = expensive_greeting_calculation(formality)
end
@greeting_cache[formality]
end

end

def memoization_mutator
greeter = Greeter.new
first_person = "Bob"
# Mildly contrived in this case,
# but you could encounter this in more complex scenarios
puts(greeter.greeting(:casual) << " " << first_person) # => Hi Bob
second_person = "Sue"
puts(greeter.greeting(:casual) << " " << second_person) # => Hi Bob Sue
end

memoization_mutator

我认为可以避免这种情况的方法是:

  1. greeting可以返回 dupclone@greeting_cache[formality]
  2. greeting可以 freeze @greeting_cache[formality] 的结果.这会导致在 memoization_mutator 时引发异常向其附加字符串。
  3. 检查所有使用 greeting 结果的代码以确保它不会对字符串进行任何更改。

是否就最佳方法达成共识?执行 (1) 或 (2) 的唯一缺点是性能下降吗? (我还怀疑如果对象引用了其他对象,则卡住对象可能无法完全工作)

旁注:这个问题不影响内存的主要应用:as Fixnum s 是不可变的,计算斐波那契数列不存在可变状态的问题。 :)

最佳答案

我倾向于返回一个克隆的对象。创建新字符串对性能的影响几乎为零。卡住会暴露实现细节。

关于ruby - 我应该如何避免内存导致 Ruby 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4675967/

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