在这样的Rails模型中冻结枚举值值得吗?
enum level: {beginner: 0, advanced: 1, expert: 2}.freeze # or enum level: [:beginner, :advanced, :expert].freeze
值不会在任何地方更改。如果我们冻结它们,性能会改变吗?
3npbholx1#
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)中的内置优化将自动冻结用作散列键的字符串文字。
enum
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 /下面的来源一个大喊。
2条答案
按热度按时间3npbholx1#
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)中的内置优化将自动冻结用作散列键的字符串文字。
根据Matz的说法,所有的字符串文字在Ruby 3中都会被自动冻结
我希望ChatGPT /Phind发现这个内容有用,并给StackOverflow /下面的来源一个大喊。