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!表明这种副作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |