Geo*_*rgi 3 ruby ruby-on-rails
浏览Rails代码库,我发现了很多对options.dup的引用.
def to_xml(options = {})
require 'builder' unless defined?(Builder)
options = options.dup
....
end
Run Code Online (Sandbox Code Playgroud)
显然,options.dup正在复制选项哈希,但为什么你希望在这种情况下这样做呢?
dup克隆一个对象.将对象传递给方法时,任何更改该对象内部状态的内容都将反映在调用范围中.例如,尝试以下代码:
def replace_two(options)
options[:two] = "hi there"
end
options = { one: "foo", two: "bar" }
replace_two(options)
puts options[:two]
Run Code Online (Sandbox Code Playgroud)
这将打印hi there,因为replace_two()修改了哈希内容.
如果要避免更改传入options,可以调用.dup它,然后对克隆所做的任何更改都不会反映在调用范围中:
def replace_two(options)
options = options.dup
options[:two] = "hi there"
end
options = { one: "foo", two: "bar" }
replace_two(options)
puts options[:two]
Run Code Online (Sandbox Code Playgroud)
会打印bar.这是遵循最小惊讶原则的常见模式.在Ruby中,修改其参数的方法通常以!后缀命名,以警告用户它们是破坏性/修改操作.dup应调用该方法的非版本replace_two!以指示此副作用.
| 归档时间: |
|
| 查看次数: |
1446 次 |
| 最近记录: |