Обезьяна, исправляющая Объект, производит странные результаты - PullRequest
4 голосов
/ 20 декабря 2011

Я взломал 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]
  • XP SP3 32-разрядная
  • ВЕРСИЯ RUBYGEMS: 1.8.12

1 Ответ

2 голосов
/ 05 января 2012

Метод to_hash используется для идентификации объектов, которые приводят к хешу. В этом смысле он ведет себя как to_ary или to_str. Реализованный вами метод больше похож на to_a или to_s.

Множество кода Ruby, включая код ядра Ruby, проверяет to_hash, чтобы выяснить, является ли аргумент хэшем опций (arg.respond_to? :to_hash) и оттуда следует другой путь выполнения. Это еще больше запутывает некоторая проверка кода, является ли объект реальным хешем или нет (Hash === arg).

Возможно, вы захотите назвать свой метод to_h или что-то подобное.

...