我看到我可以使用
获取目录中的文件列表Dir["*"]
我该如何准确阅读该语法?据我所知,您可以使用 [] 从数组或哈希中获取值。
[]如何处理电话?
答案 0 :(得分:5)
[]
只是一个方法,比如#to_s,#object_id。等
您可以在任何对象上定义它:
class CoolClass
def [](v)
puts "hello #{v}"
end
end
CoolClass.new["John"] # => "hello John"
在您的情况下,它以这种方式定义为单身方法:
class Dir
def self.[](v)
...
end
end
答案 1 :(得分:4)
从Ruby Docs开始,Dir["*"]
相当于Dir.glob(["*"])
。 (正如所指出的,它是syntactic sugar)
Dir
不是一个调用,它是一个类,class Dir
的对象是目录流,您可以像数组一样访问它们。
在您的具体情况下,Dir["*"]
将返回array
个文件名,这些文件名是从作为Dir[patternString]
传递的模式中找到的。 "*"
作为模式将匹配零个或多个字符,换句话说,它将匹配所有内容,因此将返回该目录中所有文件名的array
。
对于你的第二个问题,你可以define it as any other method这样:
class YourClass
def self.[](v)
#your code here
end
end
答案 2 :(得分:2)
方法Dir::glob
接受一个参数,并提供嵌套在参数下的所有目录和文件的数组。 (从那里,您可以使用[0]
获取数组的索引。)参数可以包括要匹配的模式以及标志。参数(模式,标志)可以是选项类似(但不完全是)正则表达式。
从文档中,包括您可能感兴趣的几个模式/标记:
请注意,此模式不是正则表达式,它更接近于shell glob。有关flags参数的含义,请参阅
File.fnmatch
。请注意,区分大小写取决于您的系统(因此忽略File::FNM_CASEFOLD
),结果的返回顺序也是如此。
*
- 匹配任何文件。可以被glob中的其他值限制。相当于regexp中的/ .* /x
。[set]
- 匹配集中的任何一个字符。行为与Regexp中的字符集完全相同,包括设置否定([^a-z]
)。
Dir::glob()
的简写是Dir[]
,虽然我更喜欢长篇。如上所示,使用括号表示参数的特殊模式/标志。以下是一些可以更好地解释这一点的示例(来自文档):
Dir["config.?"] #=> ["config.h"]
Dir.glob("config.?") #=> ["config.h"]
Dir.glob("*.[a-z][a-z]") #=> ["main.rb"]
Dir.glob("*") #=> ["config.h", "main.rb"]
您可以为[]
重新定义Dir
方法,但我不会说明 - 许多(和我自己)不建议使用猴子修补核心Ruby类和模块。但是,您可以在自己的类中创建方法。请参阅以下内容:
class User
# Class method => User.new[arg]
def self.[](arg)
end
# Instance method => @user[arg]
def [](arg)
end
end
答案 3 :(得分:1)
Dir
就像任何其他对象一样对象(它恰好是类Class
的一个实例),[]
就像任何其他方法一样(它只是一个方法)碰巧有一个有趣的名字,以及特殊的语法便利,允许它使用除正常语法之外的不同语法进行调用。)
因此,您可以像任何其他方法一样定义它:
class MyClass
def self.[](*) end
end