如何覆盖 `File::SEPARATOR`

7

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"

有人能解释一下正在发生什么吗?是否有一种方法可以通过将File::SEPARATOR设置为另一个值来覆盖此行为?

我没有特定的用例,也不在寻找解决方法...只是好奇。谢谢。

4个回答

2
当您重新定义常量时,所有未来的Ruby代码都将看到这个新值。
但是,File.join的实现是在C中完成的,它引用了分隔符的C常量,而您尚未重新定义。
任何C代码将引用原始值(在初始化Ruby解释器时设置的值),而任何Ruby代码将引用覆盖/重新定义的值。

1

File 提供了一个 FILE::SEPARATOR 常量,该常量为您提供操作系统的正确文件分隔符,还提供了 File.join 方法,该方法使用操作系统的正确文件分隔符来分隔参数。

尽管文档中所说,但似乎该函数并未使用该常量。

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中可以更改常量的值,这可能只是好的编程实践。

0
你正在寻找 Array.join 吗?
["usr", "mail", "gumby"].join("doge")

覆盖File :: SEPARATOR没有意义,它是Ruby“给”你的常量,因此您不需要猜测它是/还是\


谢谢,但我只是在寻找一个解释。问题被管理员编辑过了,他让它看起来像我在寻找那个答案。对此我很抱歉。 - cozyconemotel
我的第二句话有点解释了。不要试图覆盖常量,这是一个不好的做法。 - Gavriel
我非常清楚这一点。只是想了解Ruby内部工作的方式。不过还是谢谢你。 - cozyconemotel

0

1
那不是原因,因为在 Ruby 中常量可以被重新定义。它只是抛出一个警告。谢谢你提供的有用链接。 - cozyconemotel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接