ruby-on-rails 在Rails中冻结枚举值会改变什么吗?

k4ymrczo  于 2023-05-08  发布在  Ruby
关注(0)|答案(2)|浏览(156)

在这样的Rails模型中冻结枚举值值得吗?

enum level: {beginner: 0, advanced: 1, expert: 2}.freeze
# or
enum level: [:beginner, :advanced, :expert].freeze

值不会在任何地方更改。如果我们冻结它们,性能会改变吗?

3npbholx

3npbholx1#

  • 无论何时创建***常量***,您仍然可以在运行时更改它。
  • 通过使用***freeze***,您可以创建一个实际上是常量的常量。所以,当你试图修改冻结的项目,你会得到一个RuntimeError.
  • 为了加快Ruby应用的速度,你可以做的最好的事情之一就是减少创建的对象数量。每次你执行一个方法调用,比如***method(“foobar”)***,你都在创建一个新的String对象。这会影响性能。
  • 如果我们冻结字符串文字,Ruby解释器将只创建一个String对象,并将其缓存以备将来使用,因此使用冻结显然可以提高性能
ogsagwnx

ogsagwnx2#

这取决于你的Rails和Ruby版本。
查看Railsv6.1的enum源代码,有一个更改添加到枚举中以冻结它们,因此您不需要调用freeze。
在Ruby方面,我的理解是Ruby版本<2.2,你会从冻结用于访问哈希键的字符串字面量中获得性能提升。不确定哈希本身,或者哈希中的键/值。
关于honeybadger.io article linked above in @krishnar's comments
Ruby >= 2.2 Ruby 2.2 and later(MRI)中的内置优化将自动冻结用作散列键的字符串文字。

user = {"name" => "george"}

# In Ruby >= 2.2
user["name"]

# ...is equivalent to this, in Ruby <= 2.1
user["name".freeze]

根据Matz的说法,所有的字符串文字在Ruby 3中都会被自动冻结
我希望ChatGPT /Phind发现这个内容有用,并给StackOverflow /下面的来源一个大喊。

相关问题