ruby – monkey patching Object产生奇怪的结果
发布时间:2020-12-17 07:09:24 所属栏目:百科 来源:网络整理
导读:我正在攻击对象的to_hash(我不是说这是一个好主意,只是一个实验).当我遇到一个奇怪的问题,IO停止工作. #lib/object.rbclass Object def to_hash self.instance_variables.inject({}) { |hash,var| hash[var.to_s.delete("@")] = self.instance_variable_get(
我正在攻击对象的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>' (如果文件存在,则表示文件未打开以进行写入) 虽然我并不感到惊讶 – 只是好奇,这里发生了什么?从理论上说它应该没问题,但是根本原因是什么. 相关信息: > ruby?? 1.9.2p290(2011-07-09)[i386-mingw32] 解决方法
to_hash方法用于标识强制转换为Hash的对象.从这个意义上讲,它的行为类似于to_ary或to_str.您实现的方法更像是to_a或to_s.
许多Ruby代码(包括Ruby核心代码)检查to_hash以确定参数是否是一个选项哈希(arg.respond_to?:to_hash),并从那里开始遵循不同的执行路径.一些代码检查对象是否是真正的哈希(Hash === arg),这更加混乱. 您可能希望将方法命名为to_h或类似名称. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |