Ruby 2.7 中的 SimpleDelegator 在哪里?

S.G*_*ami 5 ruby

我一直在使用 SimpleDelegator 类做各种事情。但我注意到,Ruby 2.7 (ArchLinux x86_64) 没有附带 SimpleDelegator 类(也没有 Delegator)。

我的程序:

#!/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')
Run Code Online (Sandbox Code Playgroud)

运行:

  • 红宝石 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
Run Code Online (Sandbox Code Playgroud)
  • 红宝石 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
Run Code Online (Sandbox Code Playgroud)
  • 红宝石 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
Run Code Online (Sandbox Code Playgroud)
  • 红宝石 2.7.0:
> ruby p.rb 
Traceback (most recent call last):
p.rb:2:in `<main>': uninitialized constant SimpleDelegator (NameError)
Run Code Online (Sandbox Code Playgroud)

Ruby 2.7 中是否有 SimpleDelegator 的新替代品?

cre*_*mno 7

DelegatorSimpleDelegator类不是核心类像ArrayMutex。它们是delegate需要首先加载的标准库的一部分:require 'delegate'.

它碰巧适用于较旧的 Ruby 版本,因为它们默认带有较旧的 RubyGems 版本。RubyGems 从 Ruby 1.9开始自动加载,直到 3.1.0这意味着delegate间接加载。更新RubyGems的或运行ruby--disable=gems应引起红宝石<= 2.6完全相同的问题了。irb还加载了几个标准库:delegate还有timeout更多。

具有类似 C++ 机制的编程语言也有这个问题:而不是load/ requirethere's #include,包含标准库头文件可能包含另一个头文件,然后新版本可能不再包含另一个头文件,并且依赖旧行为的用户代码无法编译.