如何覆盖`File::SEPARATOR`

coz*_*tel 6 ruby separator pseudo-globals

文件File.join说明:

join(string, ...) ? string

返回通过使用连接字符串形成的新字符串File::SEPARATOR

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

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

File::SEPARATOR #=> "/"
File::SEPARATOR = "doge"
File::SEPARATOR #=> "doge"
File.join("so", "wow") #=> "so/wow"
Run Code Online (Sandbox Code Playgroud)

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

我没有具体的用例,也没有寻找解决方法..只是好奇。先感谢您。

Mar*_*cny 2

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

然而,它的实现File.join是在 C 中,它引用了您尚未重新定义的分隔符的 C 常量。

任何 C 代码都将引用原始值(在初始化 Ruby 解释器时设置),而任何 Ruby 代码都将引用覆盖/重新定义的值。