[]如何在Ruby中使用

时间:2015-08-25 18:35:38

标签: ruby class

我看到我可以使用

获取目录中的文件列表
Dir["*"]

我该如何准确阅读该语法?据我所知,您可以使用 [] 从数组或哈希中获取值。

[]如何处理电话?

4 个答案:

答案 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