我一直在使用 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)
运行:
> ~/.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)
> ~/.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)
> ~/.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)
> 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 的新替代品?
在Delegator和SimpleDelegator类不是核心类像Array或Mutex。它们是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,包含标准库头文件可能包含另一个头文件,然后新版本可能不再包含另一个头文件,并且依赖旧行为的用户代码无法编译.
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |