首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ruby上导航两个目录

如何在ruby上导航两个目录
EN

Stack Overflow用户
提问于 2014-07-07 15:44:46
回答 1查看 3.4K关注 0票数 4

在Ruby中,我有全局变量$file_folder,它为我提供了当前配置文件的位置:

代码语言:javascript
运行
复制
$file_folder = "#{File}"
$file_folder = /repos/.../test-folder/features/support

我需要访问一个文件位于一个不同的文件夹中,这个文件夹是两个层次上和两个层次下。是否有任何方法可以使用当前位置导航到此目标路径?

代码语言:javascript
运行
复制
target path = /repos/..../test-folder/lib/resources
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-07 15:54:13

有两种方法可以做到这一点(嗯,有几种,但这里有两种好的方法)。首先,使用File.expand_path

代码语言:javascript
运行
复制
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#+):

代码语言:javascript
运行
复制
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,但我认为它有点难看:

代码语言:javascript
运行
复制
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对象传递给任何采用路径的方法,但是有一段时间,一个方法会对字符串以外的任何东西犹豫不决,在这种情况下,您需要首先将它转换为字符串:

代码语言:javascript
运行
复制
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中是一种讨厌的代码气味。几乎总有一个比使用全局变量更好的方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24614566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档