【问题标题】:A lot of warnings after require 'Time'需要“时间”后的很多警告
【发布时间】:2020-12-30 13:16:04
【问题描述】:

当我导入 Time 和 HTTParty 时,我收到了这些警告:

C:/Ruby27-x64/lib/ruby/2.7.0/time.rb:34: warning: already initialized constant Class::ZoneOffset
C:/Ruby27-x64/lib/ruby/2.7.0/Time.rb:34: warning: previous definition of ZoneOffset was here
C:/Ruby27-x64/lib/ruby/2.7.0/time.rb:137: warning: already initialized constant Class::LeapYearMonthDays
C:/Ruby27-x64/lib/ruby/2.7.0/Time.rb:137: warning: previous definition of LeapYearMonthDays was here
C:/Ruby27-x64/lib/ruby/2.7.0/time.rb:138: warning: already initialized constant Class::CommonYearMonthDays
C:/Ruby27-x64/lib/ruby/2.7.0/Time.rb:138: warning: previous definition of CommonYearMonthDays was here
C:/Ruby27-x64/lib/ruby/2.7.0/time.rb:475: warning: already initialized constant Class::MonthValue
C:/Ruby27-x64/lib/ruby/2.7.0/Time.rb:475: warning: previous definition of MonthValue was here
C:/Ruby27-x64/lib/ruby/2.7.0/time.rb:677: warning: already initialized constant Time::RFC2822_DAY_NAME
C:/Ruby27-x64/lib/ruby/2.7.0/Time.rb:677: warning: previous definition of RFC2822_DAY_NAME was here
C:/Ruby27-x64/lib/ruby/2.7.0/time.rb:681: warning: already initialized constant Time::RFC2822_MONTH_NAME
C:/Ruby27-x64/lib/ruby/2.7.0/Time.rb:681: warning: previous definition of RFC2822_MONTH_NAME was here

这就是所有的代码:

require 'HTTParty'
require 'Time'

有人知道我如何解决这个问题吗?

【问题讨论】:

    标签: ruby time timestamp rubygems httparty


    【解决方案1】:

    Ruby 中没有 Time 库。但是,有一个 time 库。

    看起来您正在使用不区分大小写的文件系统,所以当您require 'Time' 时,操作系统会“撒谎”给 Ruby 并告诉它 Time.rb 确实存在,即使实际上只有一个 @ 987654325@。 (操作系统会对TIME.RBtImE.rBTiMe.Rb 或...说同样的话

    因此,Ruby 将加载Time.rb(实际上是time.rb)。然而,在内部time 库当然会在任何地方使用require 'time'。现在,Ruby 会检测文件何时已加载并忽略它,BUT Time.rbtime.rb 是两个不同的文件名,因此 Ruby 会自然地同时加载它们。

    不过,由于它们是同一个文件,time.rb 中的所有内容都将被执行两次,这意味着您将收到每个常量定义的警告,并且该文件中的每个方法定义

    解决方案很简单:使用require 'time',因为这是库的入口文件的名称。

    另一种方法是使用区分大小写的文件系统,在这种情况下,您会得到一个 LoadError 异常,告诉您没有名为 Time.rb 的文件。

    【讨论】:

    • 哦,我明白了,谢谢。这是否意味着我要使用的所有库/宝石都应该是小写的?如何使用区分大小写的文件系统?
    • 您应该使用 actual 文件名。大多数不区分大小写的文件系统都保留大小写,即即使它们不关心大小写,它们仍会存储大小写。因此,如果您查看文件名,您可以看到文件名的 actual 大小写是什么。对于许多库,文档中还会有一个示例,说明require 的正确参数是什么。还有一些社区编码标准,比如文件名应该始终是文件中主类或模块的lower_snake_case 版本。但这只是一个约定,不是
    • ... 强制执行,并非所有项目都遵循它。例如,按照该规则,HTTParty 的主库文件应命名为 h_t_t_party.rbhttp_party,rb,但实际上命名为 httparty.rb
    • 使用区分大小写文件系统的最简单方法是使用以区分大小写文件系统为标准的操作系统。这基本上是除 Windows 或 macOS 之外的所有操作系统,或多或少是除 FAT、exFAT、NTFS、ISO9660、HFS 和 APFS 之外的每个文件系统。比如Linux中的ext4、btrfs、reiserfs、XFS、JFS,FreeBSD中的FFS,DragonflyBSD中的HAMMER2等等,都是区分大小写的。
    猜你喜欢
    • 2020-03-19
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2019-09-30
    相关资源
    最近更新 更多