繁体   English   中英

Ruby 中 [方括号] 的所有不同用途是什么?

[英]What are all the different uses of the [square brackets] in Ruby?

我在 Ruby 中经常遇到方括号[]语法,但它似乎从来没有做同样的事情。 任何人可以列出 Ruby 中方括号[]所有不同用途,以便我的头脑可以处理这个看似无穷无尽的小符号吗? (一个符号怎么可能做这么多事情而不会让 Ruby 解释器感到困惑?)

例子:

  • [][]=方法
  • %q[...]
  • [1,2,3][0]
  • hash["a"] = 3
  • ary = []
  • /[^A-Fa-f0-9]/
  • "Is a string"[5,3]

方括号分为两个严格的上下文和一个可选的上下文:

定义数组
可以使用类似[1,2,3]的语法在代码中指定数组,即提供元素和有序元素列表的数据结构。 这产生与所述三个元素的数组12 ,和3中完全相同的顺序。 然后,您可以使用迭代器函数(如eachmap迭代数组,或者您可以通过其索引ID直接访问特定元素,如下所示。

访问数组和散列中的元素
哈希(在其他语言中也称为哈希映射,字典或关联数组)也包含与数组类似的元素。 与它们存储数据无序的方式不同。 数据不是由整数id访问的,就像数组一样,但是具有任意键(通常是符号或字符串)。 这与例如PHP不同,其中两者使用相同的Array类型。

对于哈希和数组,通过调用[][]=的方法可以方便地访问数据。

my_array = [:a, :b, :c]
second_element = my_array[1]
# => :b
# notice that the first element in arrays always has the index 0

my_hash = {:a => 1, :b => 2, :c => 3}
element_of_b = my_hash[:b]
# => 2

这是括号的常见用例。 在Ruby代码中,您有时可能会看到其他类实现括号函数。 他们这样做是为了允许类似于数组或哈希的访问,然后通常期望这些类的行为与那些类似,但这绝不是强制执行的。 另见鸭子打字

%表示法
Ruby有第三种语法来创建除常见之外的字符串(和其他对象)。 使用这种语法,代码中的文字字符串不包含在"'而是使用特殊的分隔符。它以百分号开头,单个字符指定要创建的对象,几乎任何字符都选择作为分隔符:

a = %w[foo bar baz]
b = %w{foo bar baz}
c = %wxfoo bar bazx
d = ["foo", "bar", "baz"]

这三个示例都创建了相同的数组。 请参阅一些有关如何使用此语法的文档以及Ruby中可用的其他修饰符。

虽然这里通常使用括号,但它绝不是必需的,如果需要可以替换。 这里只是建议,因为这种表示法的最常见用法是从空格分隔的字符串创建一个元素数组(如上所示)。 因此,括号的使用使得进一步清楚返回数组,因为语法看起来类似于基本数组规范。

好吧,只是为了我自己的笔记,我已经走了,仔细看看这个,并在Holger Just的答案的基础上 ,提出以下内容:在Ruby中使用方括号可以分为6个用途,其中3个是一部分Ruby的方法定义和其中3个语义结构。

方法定义

通过类方法创建对象Array :: [],Hash :: []

Array.[](1,2,3) #=> [1,2,3]                        #Un-sugared notation
Array["a","b","c"] #=> ["a","b","c"]               #Sugared equivalent
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}  

与文字构造函数无关,尽管它做同样的事情。

元素引用通过实例方法Array#[],Bignum#[],Continuation#[],Fixnum#[],Hash#[],MatchData#[],Method#[],Proc#[],String#[], Struct#[],Symbol#[],Thread#[]和类方法Dir :: [],ENV :: []

ary = [1,2,"abc", [15,16,[26,27]]]  
ary.[](2) #=> "abc"                #Un-sugared notation
ary[2] #=> "abc"                   #Sugared equivalent
ary[0,2] #=> [1,2]  
ary[3][2][1] #=> 26  
[1,2,3][0] #=> 1  
"Is a string"[7,3] #=> "rin"  

通过实例方法进行元素赋值Array#[] =,Hash#[] =,String#[] =,Struct#[] =,Thread#[] =,类方法ENV :: [] =

ary = [1,2,3]  
ary.[]=(1,"abc") #=> [1,"abc",3]    #un-sugared notation
ary[2] = "def" #=> [1,"abc","def"]  #Sugared equivalent
hash = {"a"=>1, "b"=>2}  
hash["a"] = 3 #=> {"a"=>3, "b"=>2}  

语义结构

通过数组文字构造函数创建对象

ary = []  

Ruby中有一堆文字构造函数通过使用(通常)一个简单的符号对来创建相关类的对象,方括号是数组对象的文字构造函数:Array [] ,Hash {} ,Proc ->(){} ,Range ..... ,Regexp // ,String ""'' ,符号::""

通过%表示法创建对象

%q[hello there you] #=> "hello there you"           # String % notation  
%w[hello there you] #=> ["hello", "there", "you"]   # Array % notation  

严格来说,它不是方括号表示法,而是两符号对符号,如果您愿意,可以使用方括号。 所以%q@hello there you@同样有效。

Ruby的正则表达式

/[^A-Fa-f0-9]/  

方括号表示Ruby正则表达式中的字符类。

我确实发现[]另一个用途,作为在Dir :: glob方法中使用的模式,但它应该完全像在正则表达式中那样。 不过,它表明Ruby的1500多种方法中可能存在更多用途。

使用方括号实例化结构的方便语法

irb(main):001:0> Point = Struct.new(:x, :y)                         
=> Point                      
irb(main):002:0> point = Point[1,2]                                 
=> #<struct Point x=1, y=2>   
irb(main):003:0> point.x                   
=> 1                           
irb(main):004:0> point.y                    
=> 2     

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM