我在Ruby中遇到了方括号[]
语法,但似乎从来没有做同样的事情。任何人都可以在Ruby中列出所有方括号[]
的不同用法,这样我的脑海就可以处理这个看似无穷无尽的多功能小符号吗? (如果没有Ruby解释器混淆,一个符号可以做多少呢?)
示例:
[]
和[]=
方法%q[...]
[1,2,3][0]
hash["a"] = 3
ary = []
/[^A-Fa-f0-9]/
"Is a string"[5,3]
答案 0 :(得分:11)
方括号分为两个严格的上下文和一个可选的上下文:
定义数组
通过使用类似[1,2,3]
的语法,可以在代码中指定数组,即提供元素和有序元素列表的数据结构。这将按照该顺序创建一个包含三个元素1
,2
和3
的数组。然后,您可以使用像each
或map
这样的迭代器函数迭代数组,或者您可以通过索引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代码中,您有时可能会看到其他类实现括号函数。他们这样做是为了允许类似于数组或哈希的访问,然后通常期望这些类的行为与那些类似,但这绝不是强制执行的。另请参阅Duck Typing。
%表示法
Ruby有第三种语法来创建除常见之外的字符串(和其他对象)。使用此语法,代码中的文字字符串不会被"
或'
括起来,而是使用特殊的分隔符。它以百分号开头,一个字符指定要创建的对象,几乎任何字符都选择作为分隔符:
a = %w[foo bar baz]
b = %w{foo bar baz}
c = %wxfoo bar bazx
d = ["foo", "bar", "baz"]
这三个示例都创建了相同的数组。请参阅一些documentation,了解如何使用此语法以及Ruby中可用的其他修饰符。
虽然这里使用括号很常见,但它绝不是必需的,如果需要可以替换。这里只是建议,因为这种表示法的最常见用法是从空格分隔的字符串创建一个元素数组(如上所示)。因此,括号的使用使得进一步清楚返回一个数组,因为语法看起来类似于基本数组规范。
答案 1 :(得分:8)
好吧,只是为了我自己的笔记,我已经离开并仔细研究了这个,并在Holger Just's answer的基础上,提出以下内容:在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 {}
,处理->(){}
,范围..
和...
,正则表达式//
,字符串""
和''
,符号{{1 }和:
。
通过%表示法创建对象
:""
严格来说,它不是方括号表示法,而是两符号对符号,如果您愿意,可以使用方括号。所以%q[hello there you] #=> "hello there you" # String % notation
%w[hello there you] #=> ["hello", "there", "you"] # Array % notation
同样有效。
Ruby的正则表达式
%q@hello there you@
方括号表示Ruby正则表达式中的字符类。
我确实找到了/[^A-Fa-f0-9]/
的另一种用法,作为在Dir :: glob方法中使用的模式,但它应该像在正则表达式中一样。不过,它表明Ruby的1500多种方法中可能存在更多用途。