我正在攻击to_hash
对象(我不是说这是一个好主意,只是一个实验)。当我遇到一个奇怪的问题时,IO
停止了工作。
#lib/object.rb
class Object
def to_hash
self.instance_variables.inject({}) { |hash,var| hash[var.to_s.delete("@")] = self.instance_variable_get(var); hash }
end
end
#run_test1.rb
require_relative 'lib/Object'
require 'FileUtils'
puts 'run test'
#run_test2.rb
require_relative 'lib/Object'
File.open('test.txt', 'w') {|f| f.write('this is a test')}
在run_test1中我得到了一个
<internal:lib/rubygems/custom_require>:29:in `set_encoding': wrong number of arguments (0 for 1..2) (ArgumentError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from .../run_test1.rb:2:in `<main>'
在run_test2中我得到了
run_test2.rb:3:in `initialize': No such file or directory - test.txt (Errno::ENOENT
from run_test2.rb:3:in `open'
from run_test2.rb:3:in `<main>'
(如果文件存在则表示文件未打开以供写入)
虽然我并不感到惊讶 - 只是好奇,这里发生了什么?从理论上说它应该没问题,但是根本原因是什么。
相关信息:
答案 0 :(得分:2)
to_hash
方法用于标识强制哈希的对象。从这个意义上讲,它的行为类似于to_ary
或to_str
。您实施的方法更像是to_a
或to_s
。
许多Ruby代码(包括Ruby核心代码)检查to_hash
以确定参数是否是一个选项哈希(arg.respond_to? :to_hash
)并从那里开始遵循不同的执行路径。如果对象是真实的哈希值(Hash === arg
),一些代码检查会更加混乱。
您可能希望为方法to_h
或类似名称命名。