如何覆盖 `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 值。
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 值。