在 Ruby 中,我有全局变量 $file_folder
给我当前配置文件的位置:
$file_folder = "#{File}"
$file_folder = /repos/.../test-folder/features/support
我需要访问位于不同文件夹中的文件,而这个文件夹在上两层和下两层。有什么方法可以使用当前位置导航到此目标路径吗?
target path = /repos/..../test-folder/lib/resources
最佳答案
有两种方法可以做到这一点(好吧,有几种方法,但这里有两种很好的方法)。首先,使用 File.expand_path
:
original_path = "/repos/something/test-folder/features/support"
target_path = File.expand_path("../../lib/resources", original_path)
p target_path
# => "/repos/something/test-folder/lib/resources"
请注意 File.expand_path
总是会返回一个绝对路径,所以如果你想返回一个相对路径是不合适的。如果您使用它,请确保第二个参数是绝对路径,或者,如果它是相对路径,您知道它将扩展到什么(这将取决于当前的工作目录)。
接下来,使用 Pathname#join
(别名为 Pathname#+
):
require "pathname"
original_path = Pathname("/repos/something/test-folder/features/support")
target_path = original_path + "../../lib/resources"
p target_path
# => #<Pathname:/repos/something/test-folder/lib/resources>
你也可以使用Pathname#parent
,但我觉得有点丑:
p original_path.parent.parent
# => #<Pathname:/repos/something/test-folder>
p original_path.parent.parent + "lib/resources"
# => #<Pathname:/repos/something/test-folder/lib/resources>
我更喜欢路径名,因为它使处理路径变得非常容易。通常,您可以将 Pathname 对象传递给采用路径的任何方法,但偶尔会有一个方法对字符串以外的任何其他内容犹豫不决,在这种情况下,您需要先将其转换为字符串:
p target_path.to_s
# => "/repos/something/test-folder/lib/resources"
附言foo = "#{bar}"
是 Ruby 中的反模式。如果 bar
已经是一个字符串,您应该直接使用它,即 foo = bar
。如果 bar 还不是一个字符串(或者您不确定),您应该使用 to_s
显式转换它,即 foo = bar.to_s
。
附言全局变量是 Ruby 中令人讨厌的代码味道。几乎总有比使用全局变量更好的方法。
关于ruby - 如何在 ruby 上导航两个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614566/