6

文件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

4 回答 4

2

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

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

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

于 2016-01-29T17:55:58.703 回答
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 中更改常量的值,这可能只是很好的编程。

于 2016-01-29T11:28:22.740 回答
0

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

于 2016-01-29T08:36:08.867 回答
0

您在寻找 Array.join 吗?

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

重写 File::SEPARATOR 是没有意义的,它是 ruby​​ 给你的常量,所以你不需要猜测它是 / 还是 \

于 2016-01-29T08:36:29.257 回答