如何覆盖 `File::SEPARATOR`

How to override `File::SEPARATOR`

File.join 的文档指出:

join(string, ...)string

Returns a new string formed by joining the strings using File::SEPARATOR.

File.join("usr", "mail", "gumby") #=> "usr/mail/gumby"

但是,下面的结果显示了不同的行为。

File::SEPARATOR #=> "/"
File::SEPARATOR = "doge"
File::SEPARATOR #=> "doge"
File.join("so", "wow") #=> "so/wow"

有人能解释一下发生了什么吗?有没有办法通过将 File::SEPARATOR 设置为另一个值来覆盖此行为?

我没有这方面的具体用例,也不是在寻找解决方法.. 只是好奇。提前谢谢你。

File::SEPARATOR 是一个常量,您不能重新定义它。在 Windows 中还有 File:ALT_SEPARATOR。也许你可以在这里找到答案:https://www.ruby-forum.com/topic/124904

您在寻找 Array.join 吗?

["usr", "mail", "gumby"].join("doge")

覆盖 File::SEPARATOR 没有意义,它是 ruby "gives" 的常量,因此您无需猜测它是 / 还是 \

File 给你一个 FILE::SEPARATOR 常量,它给你 OS 的正确文件分隔符,还有 File.join 方法,它用正确的参数分隔参数OS.

的文件分隔符

看起来——不管文档怎么说——该函数不使用常量。

2.3.0 :004 > File::Separator
 => "/"
2.3.0 :005 > File::Separator = "!!"
(irb):5: warning: already initialized constant File::Separator
 => "!!"
2.3.0 :006 > File::Separator
 => "!!"
2.3.0 :007 > File.join("one", "two")
 => "one/two"
2.3.0 :008 > File::Separator
 => "!!"

鉴于您 可以 更改 Ruby 中常量的值,这可能是很好的编程。

当您重新定义常量时,所有以后的 Ruby 代码都会看到这个新值。

然而,File.join 的实现是在 C 中,它引用了您尚未重新定义的 C constant of the separator

任何 C 代码都将 reference the original value(在初始化 Ruby 解释器时设置),而任何 Ruby 代码将引用 overridden/redefined 值。