在Ruby中,我有全局变量$file_folder
,它为我提供了当前配置文件的位置:
$file_folder = "#{File}"
$file_folder = /repos/.../test-folder/features/support
我需要访问一个文件位于一个不同的文件夹中,这个文件夹是两个层次上和两个层次下。是否有任何方法可以使用当前位置导航到此目标路径?
target path = /repos/..../test-folder/lib/resources
发布于 2014-07-07 15:54:13
有两种方法可以做到这一点(嗯,有几种,但这里有两种好的方法)。首先,使用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"
P.S. foo = "#{bar}"
是Ruby中的反模式。如果bar
已经是一个字符串,那么您应该直接使用它,即foo = bar
。如果bar已经不是一个字符串(或者您不确定),那么应该使用to_s
(即foo = bar.to_s
)显式地转换它。
全局变量在Ruby中是一种讨厌的代码气味。几乎总有一个比使用全局变量更好的方法。
https://stackoverflow.com/questions/24614566
复制相似问题