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

b1_*_*b1_ 11 ruby syntax

[]在Ruby中遇到了方括号语法,但似乎从来没有做同样的事情.任何人可以列出[]Ruby中方括号的所有不同用途,所以我的脑海里可以处理这个看似无穷无尽的多功能小符号吗?(如果没有Ruby解释器混淆,一个符号可以做多少呢?)

例子:

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

Hol*_*ust 11

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

定义数组
数组,即数据结构提供和有序的元素列表,可以通过使用类似的语法在代码中指定[1,2,3].这产生与所述三个元素的数组1,2以及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
Run Code Online (Sandbox Code Playgroud)

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

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

a = %w[foo bar baz]
b = %w{foo bar baz}
c = %wxfoo bar bazx
d = ["foo", "bar", "baz"]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好吧,你有我上面提到的语法元素.只有这一点.但是,许多类实现`[]`方法,它们意味着不同的东西.这些用法不能列出详尽的清单.另一个例子是`Proc`类实现`[]`方法来表示调用proc.但这不是一个新的用法,只是应用上面提到的第二种方法.通常,您所要做的就是确定上述模式之一.如果是第二个,您必须查阅文档以了解相应方法的语义. (2认同)

b1_*_*b1_ 8

好吧,只是为了我自己的笔记,我已经走了,仔细看看这个,并在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}  
Run Code Online (Sandbox Code Playgroud)

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

元素引用通过实例方法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"  
Run Code Online (Sandbox Code Playgroud)

通过实例方法进行元素赋值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}  
Run Code Online (Sandbox Code Playgroud)

语义结构

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

ary = []  
Run Code Online (Sandbox Code Playgroud)

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

通过%表示法创建对象

%q[hello there you] #=> "hello there you"           # String % notation  
%w[hello there you] #=> ["hello", "there", "you"]   # Array % notation  
Run Code Online (Sandbox Code Playgroud)

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

Ruby的正则表达式

/[^A-Fa-f0-9]/  
Run Code Online (Sandbox Code Playgroud)

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

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