加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails中options.dup的目的是什么?

发布时间:2020-12-17 01:47:04 所属栏目:百科 来源:网络整理
导读:浏览Rails代码库,我发现了很多对options.dup的引用. def to_xml(options = {}) require 'builder' unless defined?(Builder) options = options.dup ....end 显然,options.dup正在复制选项哈希,但为什么你希望在这种情况下这样做呢? 解决方法 dup克隆一个对
浏览Rails代码库,我发现了很多对options.dup的引用.

def to_xml(options = {})
  require 'builder' unless defined?(Builder)
  options = options.dup
  ....
end

显然,options.dup正在复制选项哈希,但为什么你希望在这种情况下这样做呢?

解决方法

dup克隆一个对象.将对象传递给方法时,任何更改该对象内部状态的内容都将反映在调用范围中.例如,尝试以下代码:

def replace_two(options)
  options[:two] = "hi there"
end

options = { one: "foo",two: "bar" }
replace_two(options)
puts options[:two]

那将在那里打印,因为replace_two()修改了哈希内容.

如果要避免更改传入选项,可以在其上调用.dup,然后对克隆所做的任何更改都不会反映在调用范围中:

def replace_two(options)
  options = options.dup
  options[:two] = "hi there"
end

options = { one: "foo",two: "bar" }
replace_two(options)
puts options[:two]

将打印栏.这是Principle of Least Astonishment之后的常见模式.在Ruby中,修改其参数的方法通常以a命名!后缀以提醒用户他们是破坏性/修改操作.该方法的非重复版本应该被称为replace_two!表明这种副作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读