在Ruby中,我有全局变量$file_folder
,它为我提供了当前配置文件的位置:
$file_folder = "#{File}"
$file_folder = /repos/.../test-folder/features/support
我需要访问位于不同文件夹中的文件,此文件夹分为两级,两级。有没有办法使用当前位置导航到此目标路径?
target path = /repos/..../test-folder/lib/resources
答案 0 :(得分:3)
有两种方法可以做到这一点(好吧,有几种,但这里有两种好的方法)。首先,使用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,因为它非常容易使用路径。通常,您可以将Pathname对象传递给任何采用路径的方法,但偶尔会有一个方法会忽略String以外的任何方法,在这种情况下,您需要先将其转换为字符串:
p target_path.to_s
# => "/repos/something/test-folder/lib/resources"
P.S。 foo = "#{bar}"
是Ruby中的反模式。如果bar
已经是字符串,您应该直接使用它,即foo = bar
。如果bar不是String(或者您不确定),则应使用to_s
明确地使用它,即foo = bar.to_s
。
P.P.S。全局变量在Ruby中是令人讨厌的代码味道。几乎总有一种比使用全局变量更好的方法。