Где SimpleDelegator в Ruby 2,7? - PullRequest
       1

Где SimpleDelegator в Ruby 2,7?

3 голосов
/ 29 февраля 2020

Я использовал класс SimpleDelegator для разных вещей. Но я заметил, что Ruby 2.7 (Arch Linux x86_64) не поставляется с классом SimpleDelegator (также нет делегатора).

Моя программа:

#!/usr/bin/ruby -w
class OutputDecorator < SimpleDelegator
    def puts(*args)
        STDOUT.write "Hello #{args.join}... It's Ruby #{RUBY_VERSION} #{RUBY_PLATFORM}\n"
    end
end

$stdout = OutputDecorator.new($stdout)
$stdout.puts('Sourav')
$stdout = $stdout.__getobj__
$stdout.puts('Sourav')

Работает с:

  • Ruby 2.4.6:
> ~/.rvm/rubies/ruby-2.4.6/bin/ruby p.rb 
Hello Sourav... It's Ruby 2.4.6 x86_64-linux
Sourav
  • Ruby 2.5.5:
> ~/.rvm/rubies/ruby-2.5.5/bin/ruby p.rb 
Hello Sourav... It's Ruby 2.5.5 x86_64-linux
Sourav
  • Ruby 2.6.3:
> ~/.rvm/rubies/ruby-2.6.3/bin/ruby p.rb 
Hello Sourav... It's Ruby 2.6.3 x86_64-linux
Sourav
  • Ruby 2.7.0:
> ruby p.rb 
Traceback (most recent call last):
p.rb:2:in `<main>': uninitialized constant SimpleDelegator (NameError)

Есть ли новые альтернативы SimpleDelegator в Ruby 2.7?

1 Ответ

2 голосов
/ 29 февраля 2020

Классы Delegator и SimpleDelegator не являются базовыми классами, такими как Array или Mutex. Они являются частью стандартной библиотеки delegate, которую необходимо загрузить в первую очередь: require 'delegate'.

Это работало в старых Ruby версиях, так как они поставлялись со старой версией RubyGems по умолчанию. RubyGems загружается автоматически с Ruby 1.9 и до 3.1.0 , что означает, что delegate была загружена косвенно. Обновление RubyGems или запуск ruby с помощью --disable=gems также должен вызвать ту же проблему с Ruby <= 2.6. <code>irb также загружает несколько стандартных библиотек: delegate, но также timeout и многие другие.

Языки программирования с аналогичным механизмом, как C ++, также имеют эту проблему: вместо load / require есть #include, включая стандартный заголовок библиотеки, может включать другой, тогда более новая версия может больше не включать другой заголовок, и пользовательский код, основанный на старом поведении, не компилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...