gpt4 book ai didi

ruby-on-rails - 编辑类常量

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:43 24 4
gpt4 key购买 nike

我有一个 Letter 模型。它定义了两种不同的发送方法,用于将字母作为散列发送:

class Letter < ActiveRecord::Base
SEND_METHODS = {
'Paper' => 0,
'Online' => 1
}

在某些情况下,发送方法Online 不可用,因此我在 Controller 的新建编辑 操作中将其删除:

 @send_methods = Letter::SEND_METHODS
if letter.paper?
@send_methods.delete 'Online'
end

我明白了,这段代码有味道。 (如果字母模型有一个方法会更好,它会给我散列和正确的条目。)但这不是重点。

我在使用这段代码时遇到了奇怪的行为。虽然,我将类常量Letter::SEND_METHODS 分配给了实例变量@send_methods,但@send_methods-hash 有时没有entry { 'Online' => 1 },即使 letter.paper?false。我观察到,@send_methods 有时在分配后没有条目 { 'Online' => 1 }

我的解释是,@send_methods 是按引用分配的,但 Ruby 总是按值分配...

谁能告诉我?

最佳答案

key 丢失,因为您正在删除它:

SEND_METHODS = {'Paper' => 0, 'Online' => 1}

@send_methods = SEND_METHODS
@send_methods.delete('Online')

SEND_METHODS
#=> {"Paper"=>0}

这可以通过卡住哈希来避免:

SEND_METHODS = {'Paper' => 0, 'Online' => 1}.freeze

@send_methods = SEND_METHODS
@send_methods.delete('Online') #=> RuntimeError: can't modify frozen Hash

你必须 dup哈希(创建副本)以修改它:

@send_methods = SEND_METHODS.dup
@send_methods.delete('Online')

@send_methods
#=> {"Paper"=>0}

SEND_METHODS
#=> {"Paper"=>0, "Online"=>1}

关于ruby-on-rails - 编辑类常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508307/

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